10 #include "TRACE/tracemf.h"
11 #include "artdaq/DAQdata/Globals.hh"
13 #define TRACE_NAME (app_name + "_TCP_listen_fd").c_str()
15 #include <arpa/inet.h>
17 #include <netinet/in.h>
19 #include <sys/socket.h>
28 struct sockaddr_in sin;
30 listener_fd = socket(PF_INET, SOCK_STREAM, 0);
31 if (listener_fd == -1)
33 TLOG(TLVL_ERROR) <<
"Could not open listen socket! Exiting with code 1!";
34 perror(
"socket error");
39 sts = setsockopt(listener_fd, SOL_SOCKET, SO_REUSEADDR, &opt,
sizeof(opt));
42 TLOG(TLVL_ERROR) <<
"Could not set SO_REUSEADDR! Exiting with code 2!";
43 perror(
"setsockopt SO_REUSEADDR");
47 memset(static_cast<void *>(&sin), 0,
sizeof(sin));
48 sin.sin_family = AF_INET;
49 sin.sin_port = htons(port);
50 sin.sin_addr.s_addr = INADDR_ANY;
53 sts = bind(listener_fd, reinterpret_cast<struct sockaddr *>(&sin),
sizeof(sin));
56 TLOG(TLVL_ERROR) <<
"Could not bind socket for port " << port <<
"! Exiting with code 3!";
63 socklen_t arglen =
sizeof(len);
64 sts = getsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, &arglen);
65 TLOG(TLVL_INFO) <<
"RCVBUF initial: " << len <<
" sts/errno=" << sts <<
"/" << errno <<
" arglen=" << arglen <<
" rcvbuf=" << rcvbuf <<
" listener_fd=" << listener_fd;
69 sts = setsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, arglen);
72 TLOG(TLVL_ERROR) <<
"Error with setsockopt SNDBUF " << errno;
75 sts = getsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, &arglen);
76 if (len < (rcvbuf * 2))
78 TLOG(TLVL_WARNING) <<
"RCVBUF " << len <<
" not expected (" << rcvbuf <<
" sts/errno=" << sts <<
"/" << errno;
82 TLOG(TLVL_DEBUG + 32) <<
"RCVBUF " << len <<
" sts/errno=" << sts <<
"/" << errno;
87 sts = listen(listener_fd, 5 );
90 TLOG(TLVL_ERROR) <<
"Error calling listen! errno=" << errno <<
" (" << strerror(errno) <<
")";
91 perror(
"listen error");
int TCP_listen_fd(int port, int rcvbuf)
Create a TCP listening socket on the given port and INADDR_ANY, with the given receive buffer...