1 #include "hmbdc/Copyright.hpp" 3 #include "hmbdc/app/utils/EpollTask.hpp" 4 #include "hmbdc/app/Config.hpp" 5 #include "hmbdc/comm/inet/Misc.hpp" 9 #include <sys/socket.h> 10 #include <netinet/in.h> 11 #include <arpa/inet.h> 13 namespace hmbdc {
namespace tips {
namespace reliable {
18 fd = socket(AF_INET, SOCK_STREAM, 0);
20 HMBDC_THROW(std::runtime_error,
"failed to create socket, errno=" << errno);
23 int flags = fcntl(fd, F_GETFL, 0);
25 if (fcntl(fd, F_SETFL, flags) < 0) {
26 HMBDC_THROW(std::runtime_error,
"fcntl failed errno=" << errno);
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")
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);
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);
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);
51 localPort = htons(localAddr.sin_port);
54 sockaddr_in localAddr;
T getExt(const path_type ¶m, 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