12 #include "UDPsocket.hh"
21 #include <arpa/inet.h>
23 #include <sys/socket.h>
24 #include <sys/types.h>
35 struct timeval read_timeout;
94 int UDPsocket::createSocket(
int CHANNEL)
99 sock = socket(AF_INET, SOCK_DGRAM, 0);
100 if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
102 die((
char*)
"socket");
108 sock = socket(AF_INET, SOCK_DGRAM, 0);
109 if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
111 die((
char*)
"socket");
115 memset((
char*)&servaddr, 0,
sizeof(servaddr));
118 servaddr.sin_family = AF_INET;
120 servaddr.sin_port = htons(getPORT(CHANNEL));
122 servaddr.sin_addr.s_addr = inet_addr(getIPaddress(CHANNEL));
124 cout <<
"SERVER: Channel = " << CHANNEL <<
": IP = " << getIPaddress(CHANNEL)
125 <<
", PORT = " << getPORT(CHANNEL) <<
", socket = " << sock << endl;
129 setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &optval,
sizeof(optval));
140 int UDPsocket::createClient(
int CHANNEL)
145 if((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
147 perror(
"socket creation failed");
152 memset(&servaddr, 0,
sizeof(servaddr));
155 servaddr.sin_family = AF_INET;
157 servaddr.sin_port = htons(getPORT(CHANNEL));
159 servaddr.sin_addr.s_addr = inet_addr(getIPaddress(CHANNEL));
161 cout <<
"CLIENT: Channel = " << CHANNEL <<
": IP = " << getIPaddress(CHANNEL)
162 <<
", PORT = " << getPORT(CHANNEL) <<
", socket = " << sock << endl;
168 int UDPsocket::bindSocket(
int socket)
170 if(bind(socket, (
struct sockaddr*)&servaddr,
sizeof(servaddr)) == -1)
176 memset((
char*)&cliaddr, 0,
sizeof(cliaddr));
184 int UDPsocket::set_SO_RCVBUF(
int socket, uint32_t size)
187 setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (
char*)&size,
sizeof(size));
192 int UDPsocket::set_SO_SNDBUF(
int socket, uint32_t size)
195 setsockopt(socket, SOL_SOCKET, SO_SNDBUF, (
char*)&size,
sizeof(size));
200 int UDPsocket::setTimeout(
int secs,
double usecs)
202 read_timeout.tv_sec = secs;
203 read_timeout.tv_usec = usecs;
209 int UDPsocket::sendPacket(
struct packet& p,
int socket)
215 (
const struct sockaddr*)&servaddr,
222 int UDPsocket::getPacket(
packet& p,
int socket,
int chan)
225 FD_SET(socket, &readfds);
226 ret[chan] = select(socket + 1, &readfds, NULL, NULL, &read_timeout);
230 if((p.size = recvfrom(socket,
234 (
struct sockaddr*)&cliaddr,
235 (socklen_t*)&slen)) < 0)
237 die((
char*)
"recvfrom()");
240 else if(ret[chan] == 0)
247 cout <<
"error selecting: ret = " << ret[chan] << endl;
254 int UDPsocket::flushPackets(
int socket)
256 uint16_t length = getBufferLength();
257 buffer =
new int16_t[length];
261 memset((
char*)&cliaddr, 0,
sizeof(cliaddr));
265 cout <<
"Flushing previous packets..." << endl;
269 if((recv_len = recvfrom(socket,
273 (
struct sockaddr*)&cliaddr,
274 (socklen_t*)&slen)) == -1)
276 cout <<
"No packets in queue!" << endl;
281 cout <<
"Flushed packet with size " << recv_len <<
" bytes." << endl;
UDPsocket()
This module creates a UDP socket for 10G readout (main).