artdaq  v2_03_02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
TCP_listen_fd.cc
1 // This file (TCP_listen_fd.cpp) was created by Ron Rechenmacher <ron@fnal.gov> on
2 // Apr 20, 2010. "TERMS AND CONDITIONS" governing this file are in the README
3 // or COPYING file. If you do not have such a file, one can be obtained by
4 // contacting Ron or Fermi Lab in Batavia IL, 60510, phone: 630-840-3000.
5 // $RCSfile: TCP_listen_fd.cpp,v $
6 // rev="$Revision: 1.3 $$Date: 2010/06/04 14:00:32 $";
7 
8 #include <stdio.h> // printf
9 #include <stdlib.h> // exit
10 #include <strings.h> // bzero
11 #include <sys/socket.h> /* inet_aton, socket, bind, listen, accept */
12 #include <netinet/in.h> /* inet_aton, struct sockaddr_in */
13 #include <arpa/inet.h> /* inet_aton */
14 #include <netdb.h> /* gethostbyname */
15 #include <errno.h> // errno
16 
17 #include "artdaq/DAQdata/Globals.hh"
19 
20 int
21 TCP_listen_fd(int port, int rcvbuf)
22 {
23  int sts;
24  int listener_fd;
25  struct sockaddr_in sin;
26 
27  listener_fd = socket(PF_INET, SOCK_STREAM, 0); /* man TCP(7P) */
28  if (listener_fd == -1)
29  {
30  perror("socket error");
31  exit(1);
32  }
33 
34  int opt = 1; // SO_REUSEADDR - man socket(7)
35  sts = setsockopt(listener_fd,SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
36  if (sts == -1)
37  {
38  perror("setsockopt SO_REUSEADDR");
39  return (1);
40  }
41 
42  bzero((char *)&sin, sizeof(sin));
43  sin.sin_family = AF_INET;
44  sin.sin_port = htons(port);
45  sin.sin_addr.s_addr = INADDR_ANY;
46 
47  //printf( "bind..." );fflush(stdout);
48  sts = bind(listener_fd, (struct sockaddr *)&sin, sizeof(sin));
49  if (sts == -1)
50  {
51  perror("bind error");
52  exit(1);
53  }
54  //printf( " OK\n" );
55 
56  int len = 0;
57  socklen_t arglen = sizeof(len);
58  sts = getsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, &arglen);
59  TRACE( 1,"RCVBUF initial: %d sts/errno=%d/%d arglen=%d rcvbuf=%d listener_fd=%d"
60  ,len,sts,errno,arglen,rcvbuf,listener_fd );
61  if (rcvbuf > 0)
62  {
63  len = rcvbuf;
64  sts = setsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, arglen);
65  if (sts == -1)
66  TRACE( 0, "Error with setsockopt SNDBUF %d", errno );
67  len = 0;
68  sts = getsockopt(listener_fd, SOL_SOCKET, SO_RCVBUF, &len, &arglen);
69  if (len < (rcvbuf * 2))
70  TRACE( 1,"RCVBUF %d not expected (%d) sts/errno=%d/%d"
71  ,len,rcvbuf,sts,errno);
72  else
73  TRACE( 3,"RCVBUF %d sts/errno=%d/%d", len,sts,errno );
74  }
75 
76  //printf( "listen..." );fflush(stdout);
77  sts = listen(listener_fd, 5/*QLEN*/);
78  if (sts == -1)
79  {
80  perror("listen error");
81  exit(1);
82  }
83  //printf( " OK\n" );
84 
85  return (listener_fd);
86 } // TCP_listen_fd
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...