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