otsdaq-mu2e-stm  5.02.01
server.cc
1 
5 /********************************************************************/
6 
7 #include <fstream>
8 #include <iostream>
9 #include <vector>
10 
11 #include <mutex>
12 #include <thread>
13 
14 #include <arpa/inet.h>
15 #include <string.h> //memset
16 #include <sys/socket.h>
17 #include <sys/types.h>
18 
19 #include <fcntl.h> // for open
20 #include <unistd.h> // for close
21 
22 using namespace std;
23 
24 static const uint16_t maxGbit = 10; // Gbits
25 static const double maxbytes = maxGbit * 1e9 * 0.125; // bytes
26 
27 static const uint16_t packetSize = 8198; // bytes
28 static const uint16_t BUFLEN = packetSize / 2;
29 
30 static const uint64_t rcvbufsize = 64000000000;
31 
32 struct packet
33 {
34  uint size;
35  int16_t* data;
36 };
37 
38 // static const uint off_spill_len = 30000;
39 // static const uint off_spill_size = 2*off_spill_len;
40 
41 // // Data for a single off-spill event
42 // struct off_event{
43 // // Total payload size (kb)
44 // uint16_t size = fw_tHdr_Size + off_spill_size;
45 // // Event number
46 // uint64_t number = 0;
47 // // Event length
48 // uint16_t length = 0;
49 // // Data array
50 // int16_t data[fw_tHdr_Len + off_spill_len] = {};
51 // };
52 
53 // off_event event;
54 
55 struct sockaddr_in servaddr, cliaddr;
56 struct timeval read_timeout;
57 
58 int slen = sizeof(cliaddr);
59 
60 void die(char* s)
61 {
62  perror(s);
63  exit(1);
64 }
65 
66 int createSocket()
67 {
68  int sock;
69 
70  // Creating socket file descriptor
71  sock = socket(AF_INET, SOCK_DGRAM, 0);
72  if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
73  { //IPPROTO_UDP
74  die((char*)"socket");
75  }
76 
77  close(sock);
78 
79  // Creating socket file descriptor
80  sock = socket(AF_INET, SOCK_DGRAM, 0);
81  if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
82  { //IPPROTO_UDP
83  die((char*)"socket");
84  }
85 
86  // zero out the structure
87  memset((char*)&servaddr, 0, sizeof(servaddr));
88 
89  // Filling server information
90  servaddr.sin_family = AF_INET;
91  servaddr.sin_port = htons(51872);
92  servaddr.sin_addr.s_addr = inet_addr("192.168.34.12");
93 
94  return sock;
95 }
96 
97 // Bind socket to port
98 int bindSocket(int socket)
99 {
100  if(bind(socket, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
101  {
102  die((char*)"bind");
103  }
104 
105  return socket;
106 }
107 
108 // Request packet from socket and return as vector of 16-bit words
109 int getPacket(struct packet& p, int socket)
110 {
111  int16_t* buffer;
112  buffer = new int16_t[BUFLEN];
113 
114  int recv_len;
115 
116  // Zero out the client address structure
117  memset((char*)&cliaddr, 0, sizeof(cliaddr));
118 
119  fflush(stdout);
120 
121  fd_set readfds;
122  FD_ZERO(&readfds);
123  FD_SET(socket, &readfds);
124 
125  int ret = select(socket + 1, &readfds, NULL, NULL, &read_timeout);
126  if(ret > 0)
127  {
128  // socket has pending data to read
129  if(recv_len = recvfrom(socket,
130  buffer,
131  2 * BUFLEN,
132  0,
133  (struct sockaddr*)&cliaddr,
134  (socklen_t*)&slen) < 0)
135  {
136  die((char*)"recvfrom()");
137  }
138  }
139  else if(ret == 0)
140  {
141  return 0;
142  // todo: resend the same packet again, or abort the transfer
143  }
144  else
145  {
146  cout << "error selecting" << endl;
147  }
148 
149  p.size = recv_len;
150  p.data = buffer;
151 
152  return 1;
153 }
154 
155 int main()
156 {
157  int socket = bindSocket(createSocket());
158 
159  int bufferSize =
160  setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (char*)&rcvbufsize, sizeof(rcvbufsize));
161  cout << "SO_RCVBUF = " << bufferSize << endl;
162 
163  packet dataPacket;
164 
165  uint packetCount = 0;
166 
167  uint packetNum = int(maxbytes) / packetSize;
168 
169  cout << "Waiting for packets..." << endl;
170 
171  read_timeout.tv_sec = 15;
172  read_timeout.tv_usec = 0;
173 
174  while(1)
175  {
176  if(getPacket(dataPacket, socket) == 0)
177  {
178  cout << "Socket timed out!" << endl;
179  break;
180  }
181  else
182  {
183 <<<<<<< HEAD
184  for(int i = 0; i < 50; i++)
185  {
186  cout << i << " " << dataPacket.data[i] << endl;
187  }
188  exit(0);
189 =======
190  std::cout << "Recevied packet " << packetCount << std::endl;
191 >>>>>>> bde1220c1687242e5c4d658ec8637a27ae90fbe5
192  packetCount += 1;
193  if(packetCount == 1)
194  {
195  read_timeout.tv_sec = 0;
196  read_timeout.tv_usec = 100;
197  }
198  }
199  }
200 
201  cout << "\nReceived " << packetCount << "/" << packetNum << " expected packets"
202  << " = " << double(packetCount) / double(packetNum) * 100 << " % \n"
203  << endl;
204 
205  return 1;
206 }
Definition: data.hh:4
Definition: queue.hh:10