$treeview $search $mathjax $extrastylesheet
artdaq_mfextensions
v1_03_03a
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #ifndef TCP_listen_fd_hh 00002 #define TCP_listen_fd_hh 00003 00004 // This file (TCP_listen_fd.hh) was created by Ron Rechenmacher <ron@fnal.gov> on 00005 // Sep 15, 2016. "TERMS AND CONDITIONS" governing this file are in the README 00006 // or COPYING file. If you do not have such a file, one can be obtained by 00007 // contacting Ron or Fermi Lab in Batavia IL, 60510, phone: 630-840-3000. 00008 // $RCSfile: .emacs.gnu,v $ 00009 // rev="$Revision: 1.30 $$Date: 2016/03/01 14:27:27 $"; 00010 00011 #include <arpa/inet.h> /* inet_aton */ 00012 #include <errno.h> // errno 00013 #include <netdb.h> /* gethostbyname */ 00014 #include <netinet/in.h> /* inet_aton, struct sockaddr_in */ 00015 #include <stdio.h> // printf 00016 #include <stdlib.h> // exit 00017 #include <strings.h> // bzero 00018 #include <sys/socket.h> /* inet_aton, socket, bind, listen, accept */ 00019 #include "trace.h" 00020 00032 int TCP_listen_fd(int port, int rcvbuf) { 00033 int sts; 00034 int listener_fd; 00035 struct sockaddr_in sin; 00036 00037 listener_fd = socket(PF_INET, SOCK_STREAM, 0); /* man TCP(7P) */ 00038 if (listener_fd == -1) { 00039 TLOG(TLVL_ERROR) << "Could not open listen socket! Exiting with code 1!"; 00040 perror("socket error"); 00041 exit(1); 00042 } 00043 00044 int opt = 1; // SO_REUSEADDR - man socket(7) 00045 sts = setsockopt(listener_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); 00046 if (sts == -1) { 00047 TLOG(TLVL_ERROR) << "Could not set SO_REUSEADDR! Exiting with code 2!"; 00048 perror("setsockopt SO_REUSEADDR"); 00049 return (2); 00050 } 00051 00052 bzero((char *)&sin, sizeof(sin)); 00053 sin.sin_family = AF_INET; 00054 sin.sin_port = htons(port); 00055 sin.sin_addr.s_addr = INADDR_ANY; 00056 00057 // printf( "bind..." );fflush(stdout); 00058 sts = bind(listener_fd, (struct sockaddr *)&sin, sizeof(sin)); 00059 if (sts == -1) { 00060 TLOG(TLVL_ERROR) << "Could not bind socket! Exiting with code 3!"; 00061 perror("bind error"); 00062 exit(3); 00063 } 00064 // printf( " OK\n" ); 00065 00066 int len = 0; 00067 socklen_t arglen = sizeof(len); 00068 sts = getsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, &arglen); 00069 TLOG(TLVL_WARNING) << "RCVBUF initial: " << len << " sts/errno=" << sts << "/" << errno << " arglen=" << arglen 00070 << " rcvbuf=" << rcvbuf << " listener_fd=" << listener_fd; 00071 if (rcvbuf > 0) { 00072 len = rcvbuf; 00073 sts = setsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, arglen); 00074 if (sts == -1) TLOG(TLVL_ERROR) << "Error with setsockopt SNDBUF " << errno; 00075 len = 0; 00076 sts = getsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, &arglen); 00077 if (len < (rcvbuf * 2)) 00078 TLOG(TLVL_WARNING) << "RCVBUF " << len << " not expected (" << rcvbuf << " sts/errno=" << sts << "/" << errno; 00079 else 00080 TLOG(TLVL_DEBUG) << "RCVBUF " << len << " sts/errno=" << sts << "/" << errno; 00081 } 00082 00083 // printf( "listen..." );fflush(stdout); 00084 sts = listen(listener_fd, 5 /*QLEN*/); 00085 if (sts == -1) { 00086 perror("listen error"); 00087 exit(1); 00088 } 00089 // printf( " OK\n" ); 00090 00091 return (listener_fd); 00092 } // TCP_listen_fd 00093 00094 #endif // TCP_listen_fd_hh