70 return tv.tv_sec + 0.000001*
tv.tv_usec;
80static std::vector<Source>
gSrc;
94 int fd =
socket(AF_INET, SOCK_DGRAM, 0);
97 cm_msg(
MERROR,
"open_udp_socket",
"socket(AF_INET,SOCK_DGRAM) returned %d, errno %d (%s)", fd, errno, strerror(errno));
102 status = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt,
sizeof(opt));
105 cm_msg(
MERROR,
"open_udp_socket",
"setsockopt(SOL_SOCKET,SO_REUSEADDR) returned %d, errno %d (%s)",
status, errno, strerror(errno));
109 int bufsize = 8*1024*1024;
112 status = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &bufsize,
sizeof(bufsize));
115 cm_msg(
MERROR,
"open_udp_socket",
"setsockopt(SOL_SOCKET,SO_RCVBUF) returned %d, errno %d (%s)",
status, errno, strerror(errno));
119 struct sockaddr_in local_addr;
120 memset(&local_addr, 0,
sizeof(local_addr));
122 local_addr.sin_family = AF_INET;
123 local_addr.sin_port = htons(server_port);
124 local_addr.sin_addr.s_addr = INADDR_ANY;
126 status = bind(fd, (
struct sockaddr *)&local_addr,
sizeof(local_addr));
129 cm_msg(
MERROR,
"open_udp_socket",
"bind(port=%d) returned %d, errno %d (%s)", server_port,
status, errno, strerror(errno));
134 unsigned size =
sizeof(xbufsize);
136 status = getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &xbufsize, &size);
141 cm_msg(
MERROR,
"open_udp_socket",
"getsockopt(SOL_SOCKET,SO_RCVBUF) returned %d, errno %d (%s)",
status, errno, strerror(errno));
145 cm_msg(
MINFO,
"open_udp_socket",
"UDP port %d socket receive buffer size is %d", server_port, xbufsize);
152 int v = memcmp(&s->
addr,
addr, addr_len);
154 for (
int i=0;
i<addr_len;
i++)
155 printf(
"%3d - 0x%02x 0x%02x\n",
i, ((
char*)&s->
addr)[
i], ((
char*)
addr)[
i]);
156 printf(
"match %d, hostname [%s] bank [%s], status %d\n", addr_len, s->
host_name.c_str(), s->
bank_name, v);
165 struct timeval timeout;
170 timeout.tv_sec = msec/1000;
171 timeout.tv_usec = (msec%1000)*1000;
173 status = select(
socket+1, &fdset, NULL, NULL, &timeout);
176 if (
status < 0 && errno == EINTR) {
182 cm_msg(
MERROR,
"wait_udp",
"select() returned %d, errno %d (%s)",
status, errno, strerror(errno));
190 if (FD_ISSET(
socket, &fdset)) {
200 char host[NI_MAXHOST], service[NI_MAXSERV];
202 int status = getnameinfo(paddr, addr_len, host, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICSERV);
205 cm_msg(
MERROR,
"read_udp",
"getnameinfo() returned %d (%s), errno %d (%s)",
status, gai_strerror(
status), errno, strerror(errno));
210 int size =
sizeof(bankname);
215 cm_msg(
MERROR,
"read_udp",
"UDP packet from unknown host \"%s\"", host);
216 cm_msg(
MINFO,
"read_udp",
"Register this host by running following commands:");
217 cm_msg(
MINFO,
"read_udp",
"odbedit -c \"create STRING /Equipment/%s/Settings/%s\"",
EQ_NAME, host);
218 cm_msg(
MINFO,
"read_udp",
"odbedit -c \"set /Equipment/%s/Settings/%s AAAA\", where AAAA is the MIDAS bank name for this host",
EQ_NAME, host);
225 if (strlen(bankname) != 4) {
226 cm_msg(
MERROR,
"read_udp",
"ODB \"/Equipment/%s/Settings/%s\" should be set to a 4 character MIDAS bank name",
EQ_NAME, host);
228 cm_msg(
MINFO,
"read_udp",
"odbedit -c \"set /Equipment/%s/Settings/%s AAAA\", where AAAA is the MIDAS bank name for this host",
EQ_NAME, host);
232 cm_msg(
MINFO,
"read_udp",
"UDP packets from host \"%s\" will be stored in bank \"%s\"", host, bankname);
236 memcpy(&src->
addr, paddr,
sizeof(src->
addr));
247 static int count = 0;
248 static double tt = 0;
251 double dt = (t-tt)*1e6;
254 printf(
"read_udp: %5d %6.0f usec\n",
count, dt);
260 struct sockaddr
addr;
261 socklen_t addr_len =
sizeof(
addr);
262 int rd = recvfrom(
socket, buf, bufsize, 0, &
addr, &addr_len);
265 cm_msg(
MERROR,
"read_udp",
"recvfrom() returned %d, errno %d (%s)", rd, errno, strerror(errno));
269 for (
unsigned i=0;
i<
gSrc.size();
i++) {
290 cm_msg(
MERROR,
"read_udp",
"further messages are now suppressed...");
315 cm_msg(
MERROR,
"frontend_init",
"Cannot connect to ODB, cm_get_experiment_database() returned %d",
status);
320 path +=
"/Equipment";
325 std::string path1 = path +
"/udp_port";
327 int udp_port = 50005;
328 int size =
sizeof(udp_port);
332 cm_msg(
MERROR,
"frontend_init",
"Cannot find \"%s\", db_get_value() returned %d", path1.c_str(),
status);
339 cm_msg(
MERROR,
"frontend_init",
"Cannot find \"%s\", db_find_key() returned %d", path.c_str(),
status);
346 printf(
"frontend_init: cannot open udp socket\n");
347 cm_msg(
MERROR,
"frontend_init",
"Cannot open UDP socket for port %d", udp_port);
351 cm_msg(
MINFO,
"frontend_init",
"Frontend equipment \"%s\" is ready, listening on UDP port %d",
EQ_NAME, udp_port);
401#define MAX_UDP_SIZE (0x10000)
415 memcpy(pdata, buf, length);
const char * frontend_file_name
int frontend_exit()
Frontend exit.
int read_event(char *pevent, INT off)
int end_of_run(int run, char *err)
End of Run.
bool addr_match(const Source *s, void *addr, int addr_len)
static int gUnknownPacketCount
int frontend_loop()
Frontend loop.
BOOL equipment_common_overwrite
int interrupt_configure(INT cmd, INT source, PTYPE adr)
int open_udp_socket(int server_port)
INT poll_event(INT source, INT count, BOOL test)
int read_udp(int socket, char *buf, int bufsize, char *pbankname)
int find_source(Source *src, const sockaddr *paddr, int addr_len)
const char * frontend_name
static double GetTimeSec()
static bool gSkipUnknownPackets
int wait_udp(int socket, int msec)
int frontend_init()
Frontend initialization.
static std::vector< Source > gSrc
int begin_of_run(int run, char *err)
Begin of Run.
INT bk_close(void *event, void *pdata)
void bk_init32(void *event)
void bk_create(void *event, const char *name, WORD type, void **pdata)
INT bk_size(const void *event)
INT cm_get_experiment_database(HNDLE *hDB, HNDLE *hKeyClient)
INT ss_sleep(INT millisec)
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
INT db_get_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, void *data, INT *buf_size, DWORD type, BOOL create)
INT db_find_key(HNDLE hDB, HNDLE hKey, const char *key_name, HNDLE *subhKey)
int gettimeofday(struct timeval *tp, void *tzp)