$treeview $search $mathjax $extrastylesheet
artdaq
v3_04_00
$projectbrief
|
$projectbrief
|
$searchbox |
00001 // This file (TCP_listen_fd.cpp) was created by Ron Rechenmacher <ron@fnal.gov> on 00002 // Apr 20, 2010. "TERMS AND CONDITIONS" governing this file are in the README 00003 // or COPYING file. If you do not have such a file, one can be obtained by 00004 // contacting Ron or Fermi Lab in Batavia IL, 60510, phone: 630-840-3000. 00005 // $RCSfile: TCP_listen_fd.cpp,v $ 00006 // rev="$Revision: 1.3 $$Date: 2010/06/04 14:00:32 $"; 00007 00008 #define TRACE_NAME (app_name + "_TCP_listen_fd").c_str() 00009 #include "artdaq/DAQdata/Globals.hh" 00010 00011 #include <stdio.h> // printf 00012 #include <stdlib.h> // exit 00013 #include <strings.h> // bzero 00014 #include <sys/socket.h> /* inet_aton, socket, bind, listen, accept */ 00015 #include <netinet/in.h> /* inet_aton, struct sockaddr_in */ 00016 #include <arpa/inet.h> /* inet_aton */ 00017 #include <netdb.h> /* gethostbyname */ 00018 #include <errno.h> // errno 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); /* man TCP(7P) */ 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; // SO_REUSEADDR - man socket(7) 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 //printf( "bind..." );fflush(stdout); 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 //printf( " OK\n" ); 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_INFO) << "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 //printf( "listen..." );fflush(stdout); 00080 sts = listen(listener_fd, 5/*QLEN*/); 00081 if (sts == -1) 00082 { 00083 perror("listen error"); 00084 exit(1); 00085 } 00086 //printf( " OK\n" ); 00087 00088 return (listener_fd); 00089 } // TCP_listen_fd