hmbdc
simplify-high-performance-messaging-programming
Transport.hpp
1 #include "hmbdc/Copyright.hpp"
2 #pragma once
3 
4 #include "hmbdc/app/utils/EpollTask.hpp"
5 #include "hmbdc/app/Config.hpp"
6 #include "hmbdc/comm/inet/Misc.hpp"
7 
8 #include <stdexcept>
9 #include <memory>
10 #include <string>
11 
12 #include <sys/types.h>
13 #include <sys/socket.h>
14 #include <netinet/in.h>
15 #include <arpa/inet.h>
16 #include <fcntl.h>
17 
18 namespace hmbdc { namespace tips { namespace tcpcast {
19 
21  EpollFd(app::Config const& cfg)
22  : localAddr{0} {
23  fd = socket(AF_INET, SOCK_STREAM, 0);
24  if(fd < 0) {
25  HMBDC_THROW(std::runtime_error, "failed to create socket, errno=" << errno);
26  }
27 
28  int flags = fcntl(fd, F_GETFL, 0);
29  flags |= O_NONBLOCK;
30  if (fcntl(fd, F_SETFL, flags) < 0) {
31  HMBDC_THROW(std::runtime_error, "fcntl failed errno=" << errno);
32  }
33 
34  uint32_t yes = 1;
35  if (setsockopt(fd, SOL_SOCKET,SO_REUSEADDR, &yes, sizeof(yes)) < 0) {
36  HMBDC_LOG_C("failed to set reuse address errno=", errno);
37  }
38 
39  localAddr.sin_family = AF_INET;
40  localAddr.sin_addr.s_addr = inet_addr(hmbdc::comm::inet::getLocalIpMatchMask(
41  cfg.getExt<std::string>("ifaceAddr")).c_str());
42  localAddr.sin_port = htons(cfg.getExt<uint16_t>("tcpPort"));
43  if (::bind(fd, (sockaddr*)&localAddr, sizeof(localAddr)) < 0) {
44  HMBDC_THROW(std::runtime_error, "failed to bind, errno=" << errno);
45  }
46 
47  auto addrLen = socklen_t(sizeof(localAddr));
48  if (getsockname(fd, (sockaddr*)&localAddr, &addrLen) < 0) {
49  HMBDC_THROW(std::runtime_error, "getsockname failure, errno=" << errno);
50  }
51 
52  char ipaddr[INET_ADDRSTRLEN];
53  if (!inet_ntop(AF_INET, &(localAddr.sin_addr), ipaddr, INET_ADDRSTRLEN)) {
54  HMBDC_THROW(std::runtime_error, "failed to inet_ntop, errno=" << errno);
55  }
56  localIp = ipaddr;
57  localPort = htons(localAddr.sin_port);
58  }
59 
60  sockaddr_in localAddr;
61  std::string localIp;
62  uint16_t localPort;
63 };
64 
65 struct Transport {
66  using ptr = std::shared_ptr<Transport>;
67 
68  Transport(app::Config const& cfg)
69  : config_(cfg) {
70  cfg (hmbdcName_, "hmbdcName")
71  (schedPolicy_, "schedPolicy")
72  (schedPriority_, "schedPriority")
73  ;
74  }
75 
76  std::tuple<char const*, int> schedSpec() const {
77  return std::make_tuple(this->schedPolicy_.c_str(), this->schedPriority_);
78  }
79 
80  bool operator == (Transport const& other ) const {
81  return &config_ == &other.config_;
82  }
83 
84  bool operator < (Transport const& other ) const {
85  return &config_ < &other.config_;
86  }
87 
88  virtual ~Transport(){}
89 
90 protected:
91  char const* hmbdcName() const {
92  return this->hmbdcName_.c_str();
93  }
94 
95  app::Config const config_;
96  int schedPriority_;
97 
98 private:
99  std::string hmbdcName_;
100  std::string schedPolicy_;
101 };
102 }}}
T getExt(const path_type &param, bool throwIfMissing=true) const
get a value from the config
Definition: Config.hpp:238
class to hold an hmbdc configuration
Definition: Config.hpp:45
Definition: Transport.hpp:65
Definition: EpollTask.hpp:87
Definition: Transport.hpp:20
Definition: Base.hpp:12