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