1 #ifndef TCP_listen_fd_hh
2 #define TCP_listen_fd_hh
11 #include <arpa/inet.h>
14 #include <netinet/in.h>
18 #include <sys/socket.h>
35 struct sockaddr_in sin;
37 listener_fd = socket(PF_INET, SOCK_STREAM, 0);
38 if (listener_fd == -1) {
39 TLOG(TLVL_ERROR) <<
"Could not open listen socket! Exiting with code 1!";
40 perror(
"socket error");
45 sts = setsockopt(listener_fd, SOL_SOCKET, SO_REUSEADDR, &opt,
sizeof(opt));
47 TLOG(TLVL_ERROR) <<
"Could not set SO_REUSEADDR! Exiting with code 2!";
48 perror(
"setsockopt SO_REUSEADDR");
52 bzero((
char *)&sin,
sizeof(sin));
53 sin.sin_family = AF_INET;
54 sin.sin_port = htons(port);
55 sin.sin_addr.s_addr = INADDR_ANY;
58 sts = bind(listener_fd, (
struct sockaddr *)&sin,
sizeof(sin));
60 TLOG(TLVL_ERROR) <<
"Could not bind socket! Exiting with code 3!";
67 socklen_t arglen =
sizeof(len);
68 sts = getsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, &arglen);
69 TLOG(TLVL_WARNING) <<
"RCVBUF initial: " << len <<
" sts/errno=" << sts <<
"/" << errno <<
" arglen=" << arglen
70 <<
" rcvbuf=" << rcvbuf <<
" listener_fd=" << listener_fd;
73 sts = setsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, arglen);
74 if (sts == -1) TLOG(TLVL_ERROR) <<
"Error with setsockopt SNDBUF " << errno;
76 sts = getsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, &arglen);
77 if (len < (rcvbuf * 2))
78 TLOG(TLVL_WARNING) <<
"RCVBUF " << len <<
" not expected (" << rcvbuf <<
" sts/errno=" << sts <<
"/" << errno;
80 TLOG(TLVL_DEBUG) <<
"RCVBUF " << len <<
" sts/errno=" << sts <<
"/" << errno;
84 sts = listen(listener_fd, 5 );
86 perror(
"listen error");
94 #endif // TCP_listen_fd_hh
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...