hmbdc
simplify-high-performance-messaging-programming
TcpEpollFd.hpp
1 #include "hmbdc/Copyright.hpp"
2 #pragma once
3 #include "hmbdc/app/utils/EpollTask.hpp"
4 #include "hmbdc/app/Config.hpp"
5 #include "hmbdc/comm/inet/Misc.hpp"
6 #include <string>
7 
8 #include <sys/types.h>
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <arpa/inet.h>
12 
13 namespace hmbdc { namespace tips { namespace reliable {
15  TcpEpollFd(app::Config const& cfg)
16  : localAddr{0} {
17  using std::string;
18  fd = socket(AF_INET, SOCK_STREAM, 0);
19  if(fd < 0) {
20  HMBDC_THROW(std::runtime_error, "failed to create socket, errno=" << errno);
21  }
22 
23  int flags = fcntl(fd, F_GETFL, 0);
24  flags |= O_NONBLOCK;
25  if (fcntl(fd, F_SETFL, flags) < 0) {
26  HMBDC_THROW(std::runtime_error, "fcntl failed errno=" << errno);
27  }
28 
29  localAddr.sin_family = AF_INET;
30  localAddr.sin_addr.s_addr = inet_addr(
31  hmbdc::comm::inet::getLocalIpMatchMask(
32  cfg.getExt<string>("tcpIfaceAddr") == string("ifaceAddr")
33  ?cfg.getExt<string>("ifaceAddr"):cfg.getExt<string>("tcpIfaceAddr")
34  ).c_str()
35  );
36  localAddr.sin_port = htons(cfg.getExt<uint16_t>("tcpPort"));
37  if (::bind(fd, (sockaddr*)&localAddr, sizeof(localAddr)) < 0) {
38  HMBDC_THROW(std::runtime_error, "failed to bind, errno=" << errno);
39  }
40 
41  auto addrLen = socklen_t(sizeof(localAddr));
42  if (getsockname(fd, (sockaddr*)&localAddr, &addrLen) < 0) {
43  HMBDC_THROW(std::runtime_error, "getsockname failure, errno=" << errno);
44  }
45 
46  char ipaddr[INET_ADDRSTRLEN];
47  if (!inet_ntop(AF_INET, &(localAddr.sin_addr), ipaddr, INET_ADDRSTRLEN)) {
48  HMBDC_THROW(std::runtime_error, "failed to inet_ntop, errno=" << errno);
49  }
50  localIp = ipaddr;
51  localPort = htons(localAddr.sin_port);
52  }
53 
54  sockaddr_in localAddr;
55  std::string localIp;
56  uint16_t localPort;
57 };
58 }}}
T getExt(const path_type &param, bool throwIfMissing=true) const
get a value from the config
Definition: Config.hpp:238
Definition: TcpEpollFd.hpp:14
class to hold an hmbdc configuration
Definition: Config.hpp:45
Definition: EpollTask.hpp:87
Definition: Base.hpp:12