-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/nettrans.c,v 6.8 1999-11-16 16:07:22 hades Rel $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/nettrans.c,v 6.9 2000-02-18 11:59:24 muench Exp $";
#define _XOPEN_SOURCE_EXTENDED
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
#include <sys/time.h>
+#include <sys/types.h>
#include <hadesstd.h>
return a < b ? a : b;
}
-static int openUdp(NetTrans *my, const char *name, int fl) {
- return -1;
+static int openUdp(NetTrans *my, unsigned long addr, int port, int fl) {
+ int retVal;
+ struct sockaddr_in sa;
+
+ assert(my != NULL);
+
+ my->fd = socket(AF_INET, SOCK_DGRAM, 0);
+
+ if (-1 == my->fd) {
+ retVal = -1;
+ } else {
+ switch (fl) {
+ case O_RDONLY:
+ sa.sin_family = AF_INET;
+ sa.sin_port = htons(port);
+ sa.sin_addr.s_addr = 0;
+ retVal = bind(my->fd, &sa, sizeof(sa));
+ break;
+ case O_WRONLY:
+ sa.sin_family = AF_INET;
+ sa.sin_port = htons(port);
+ sa.sin_addr.s_addr = addr;
+ retVal = connect(my->fd, &sa, sizeof(sa));
+ break;
+ default:
+ errno = EINVAL;
+ retVal = -1;
+ break;
+ }
+
+ if (0 > retVal) {
+ close(my->fd);
+ } else {
+ my->mtuSize = 8192;
+ }
+ }
+
+ if (0 > retVal) {
+ msglog(LOG_DEBUG, "openAtm: %s\n", strerror(errno));
+ }
+ return retVal;
}
static int openAtm(NetTrans *my, int vpi, int vci, size_t bw, int fl) {
deleteLAtm(my->lAtm);
} else {
my->mtuSize = LAtm_mtu(my->lAtm);
+ my->fd = LAtm_fd(my->lAtm);
}
}
my->type = NetTransType_atm;
retVal = openAtm(my, vpi, vci, bandwidth, flags);
} else if (strcmp(fam, "UDP") == 0) {
+ unsigned long addr;
+ int port;
+
+ addr = inet_addr(pa);
+ port = atoi(ep);
my->type = NetTransType_udp;
- retVal = openUdp(my, name, flags);
+ retVal = openUdp(my, addr, port,flags);
} else {
my->type = NetTransType_invalid;
errno = EINVAL;
deleteLAtm(my->lAtm);
retVal = 0;
break;
+ case NetTransType_udp:
+ close(my->fd);
+ retVal = 0;
+ break;
}
if (0 > retVal) {
case NetTransType_atm:
retVal = LAtm_send(my->lAtm, my->pkt, Pkt_size(my->pkt));
break;
+ case NetTransType_udp:
+ retVal = send(my->fd, my->pkt, Pkt_size(my->pkt), 0);
+ break;
}
if (retVal != Pkt_size(my->pkt)) {
case NetTransType_atm:
retVal = LAtm_recv(my->lAtm, my->pkt, my->mtuSize);
break;
+ case NetTransType_udp:
+ retVal = recv(my->fd, my->pkt, my->mtuSize, 0);
+ break;
}
if (retVal != Pkt_size(my->pkt)) {
do {
FD_ZERO(fdSet);
for (i = 0; i < nrOfMsgs; i++) {
- FD_SET(my[i]->lAtm->fd, fdSet);
+ FD_SET(my[i]->fd, fdSet);
}
if (0 > select(getdtablesize(), fdSet, NULL, NULL, NULL)) {
abort();
}
for (i = 0; i < nrOfMsgs; i++) {
- if (FD_ISSET(my[i]->lAtm->fd, fdSet)) {
+ if (FD_ISSET(my[i]->fd, fdSet)) {
if (assembleMsg(my[i], hadTu[i], size[i])) {
msgIsComplete |= 1 << i;
}