1 #include "otsdaq-core/NetworkUtilities/Socket.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
3 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
10 #include <arpa/inet.h>
29 Socket::Socket(
const std::string &IPAddress,
unsigned int port)
31 , IPAddress_ (IPAddress)
32 , requestedPort_ (port)
35 __COUT__ << std::endl;
37 socketAddress_.sin_family = AF_INET;
38 socketAddress_.sin_port = htons(port);
40 __COUT__ <<
"IPAddress: " << IPAddress <<
" port: " << port <<
" htons: " << socketAddress_.sin_port << std::endl;
41 if(inet_aton(IPAddress.c_str(), &socketAddress_.sin_addr) == 0)
43 __SS__ <<
"FATAL: Invalid IP/Port combination. Is it already in use? " <<
44 IPAddress <<
"/" << port << std::endl;
46 __COUT__ <<
"\n" << ss.str();
47 throw std::runtime_error(ss.str());
50 memset(&(socketAddress_.sin_zero),
'\0', 8);
57 __SS__ <<
"ERROR: This method should never be called. This is the protected constructor. There is something wrong in your inheritance scheme!" << std::endl;
58 __COUT__ <<
"\n" << ss.str();
60 throw std::runtime_error(ss.str());
66 __COUT__ <<
"CLOSING THE SOCKET #" << socketNumber_ <<
" IP: " << IPAddress_ <<
" port: " << getPort() <<
" htons: " << socketAddress_.sin_port << std::endl;
67 if(socketNumber_ != -1)
72 void Socket::initialize(
unsigned int socketReceiveBufferSize)
74 __COUT__ <<
" htons: " << socketAddress_.sin_port << std::endl;
75 struct addrinfo hints;
80 memset(&hints, 0,
sizeof hints);
81 hints.ai_family = AF_INET;
82 hints.ai_socktype = SOCK_DGRAM;
83 hints.ai_flags = AI_PASSIVE;
85 bool socketInitialized =
false;
86 int fromPort = FirstSocketPort;
87 int toPort = LastSocketPort;
89 if(ntohs(socketAddress_.sin_port) != 0)
90 fromPort = toPort = ntohs(socketAddress_.sin_port);
92 std::stringstream port;
94 for(
int p=fromPort; p<=toPort && !socketInitialized; p++)
98 std::cout << __COUT_HDR_FL__ << __LINE__ <<
"]\tBinding port: " << port.str() << std::endl;
99 socketAddress_.sin_port = htons(p);
101 if((status = getaddrinfo(NULL, port.str().c_str(), &hints, &res)) != 0)
103 std::cout << __COUT_HDR_FL__ << __LINE__ <<
"]\tGetaddrinfo error status: " << status << std::endl;
108 socketNumber_ = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
110 std::cout << __COUT_HDR_FL__ << __LINE__ <<
"]\tSocket Number: " << socketNumber_ <<
" for port: " << ntohs(socketAddress_.sin_port) <<
" initialized." << std::endl;
112 if(bind(socketNumber_, res->ai_addr, res->ai_addrlen) == -1)
114 std::cout << __COUT_HDR_FL__ <<
"Error********Error********Error********Error********Error********Error" << std::endl;
115 std::cout << __COUT_HDR_FL__ <<
"FAILED BIND FOR PORT: " << port.str() <<
" ON IP: " << IPAddress_ << std::endl;
116 std::cout << __COUT_HDR_FL__ <<
"Error********Error********Error********Error********Error********Error" << std::endl;
121 std::cout << __COUT_HDR_FL__ <<
":):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)" << std::endl;
122 std::cout << __COUT_HDR_FL__ <<
":):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)" << std::endl;
123 std::cout << __COUT_HDR_FL__ <<
"SOCKET ON PORT: " << port.str() <<
" ON IP: " << IPAddress_ <<
" INITIALIZED OK!" << std::endl;
124 std::cout << __COUT_HDR_FL__ <<
":):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)" << std::endl;
125 std::cout << __COUT_HDR_FL__ <<
":):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)" << std::endl;
127 setsockopt(socketNumber_,SOL_SOCKET,SO_REUSEADDR,&yes,
sizeof(
int));
128 socketInitialized =
true;
129 std::cout << __COUT_HDR_FL__ << __LINE__ <<
"]\tSocket Number: " << socketNumber_ <<
" for port: " << ntohs(socketAddress_.sin_port) <<
" initialized." << std::endl;
135 if(!socketInitialized)
137 __SS__ <<
"FATAL: Socket could not initialize socket. Perhaps it is already in use?" << std::endl;
138 std::cout << ss.str();
139 throw std::runtime_error(ss.str());
143 if (setsockopt(socketNumber_, SOL_SOCKET, SO_RCVBUF,
144 (
char*)&socketReceiveBufferSize,
145 sizeof(socketReceiveBufferSize)) < 0) {
146 __COUT_ERR__ <<
"Failed to set socket receive size to " <<
147 socketReceiveBufferSize <<
". Attempting to revert to default." << std::endl;
149 socketReceiveBufferSize = defaultSocketReceiveSize_;
150 if (setsockopt(socketNumber_, SOL_SOCKET, SO_RCVBUF,
151 (
char*)&socketReceiveBufferSize,
152 sizeof(socketReceiveBufferSize)) < 0)
154 __SS__ <<
"Failed to set socket receive size to " <<
155 socketReceiveBufferSize <<
". Attempting to revert to default." << std::endl;
156 std::cout << ss.str();
157 throw std::runtime_error(ss.str());
163 uint16_t Socket::getPort()
165 struct sockaddr_in sin;
166 socklen_t len =
sizeof(sin);
167 getsockname(socketNumber_, (
struct sockaddr *)&sin, &len);
168 return ntohs(sin.sin_port);
172 const struct sockaddr_in& Socket::getSocketAddress(
void)
174 return socketAddress_;