00001 #ifndef TCP_listen_fd_hh
00002 #define TCP_listen_fd_hh
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <stdio.h>
00013 #include <stdlib.h>
00014 #include <strings.h>
00015 #include <sys/socket.h>
00016 #include <netinet/in.h>
00017 #include <arpa/inet.h>
00018 #include <netdb.h>
00019 #include <errno.h>
00020 #include "trace.h"
00021
00033 int TCP_listen_fd(int port, int rcvbuf)
00034 {
00035 int sts;
00036 int listener_fd;
00037 struct sockaddr_in sin;
00038
00039 listener_fd = socket(PF_INET, SOCK_STREAM, 0);
00040 if (listener_fd == -1)
00041 {
00042 TLOG(TLVL_ERROR) << "Could not open listen socket! Exiting with code 1!";
00043 perror("socket error");
00044 exit(1);
00045 }
00046
00047 int opt = 1;
00048 sts = setsockopt(listener_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
00049 if (sts == -1)
00050 {
00051 TLOG(TLVL_ERROR) << "Could not set SO_REUSEADDR! Exiting with code 2!";
00052 perror("setsockopt SO_REUSEADDR");
00053 return (2);
00054 }
00055
00056 bzero((char *)&sin, sizeof(sin));
00057 sin.sin_family = AF_INET;
00058 sin.sin_port = htons(port);
00059 sin.sin_addr.s_addr = INADDR_ANY;
00060
00061
00062 sts = bind(listener_fd, (struct sockaddr *)&sin, sizeof(sin));
00063 if (sts == -1)
00064 {
00065 TLOG(TLVL_ERROR) << "Could not bind socket! Exiting with code 3!";
00066 perror("bind error");
00067 exit(3);
00068 }
00069
00070
00071 int len = 0;
00072 socklen_t arglen = sizeof(len);
00073 sts = getsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, &arglen);
00074 TLOG(TLVL_WARNING) << "RCVBUF initial: " << len << " sts/errno=" << sts << "/" << errno << " arglen=" << arglen << " rcvbuf=" << rcvbuf << " listener_fd=" << listener_fd;
00075 if (rcvbuf > 0)
00076 {
00077 len = rcvbuf;
00078 sts = setsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, arglen);
00079 if (sts == -1)
00080 TLOG(TLVL_ERROR) << "Error with setsockopt SNDBUF " << errno;
00081 len = 0;
00082 sts = getsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, &arglen);
00083 if (len < (rcvbuf * 2))
00084 TLOG(TLVL_WARNING) << "RCVBUF " << len << " not expected (" << rcvbuf << " sts/errno=" << sts << "/" << errno;
00085 else
00086 TLOG(TLVL_DEBUG) << "RCVBUF " << len << " sts/errno=" << sts << "/" << errno;
00087 }
00088
00089
00090 sts = listen(listener_fd, 5);
00091 if (sts == -1)
00092 {
00093 perror("listen error");
00094 exit(1);
00095 }
00096
00097
00098 return (listener_fd);
00099 }
00100
00101 #endif // TCP_listen_fd_hh