]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
connectionless UDP, works in Munich
authormuench <muench>
Mon, 3 Nov 2003 16:49:09 +0000 (16:49 +0000)
committermuench <muench>
Mon, 3 Nov 2003 16:49:09 +0000 (16:49 +0000)
hadaq/nettrans.c
hadaq/nettrans.h

index 43e533fc3277e3b718f357862908503c8e6b7b8a..952dfe3de0ba3636a6d6fb33177b1e26be78deea 100644 (file)
@@ -1,4 +1,4 @@
-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/nettrans.c,v 6.28 2003-05-14 13:54:44 muench Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/nettrans.c,v 6.29 2003-11-03 16:49:09 muench Exp $";
 
 
 #define _GNU_SOURCE
@@ -34,7 +34,6 @@ static int min(int a, int b)
 static int openUdp(NetTrans *my, unsigned long addr, int port, int fl)
 {
        int retVal;
-       struct sockaddr_in sa;
 
        assert(my != NULL);
 
@@ -43,34 +42,18 @@ static int openUdp(NetTrans *my, unsigned long addr, int port, int fl)
        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, (struct sockaddr *) &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, (struct sockaddr *) &sa, sizeof(sa));
-                       break;
-               default:
-                       errno = EINVAL;
-                       retVal = -1;
-                       break;
-               }
-
-               if (0 > retVal) {
-                       close(my->fd);
-               } else {
-                       my->mtuSize = 8192;
-               }
+               my->spec.sa.sin_family = AF_INET;
+               my->spec.sa.sin_port = port;
+               my->spec.sa.sin_addr.s_addr = htonl(INADDR_ANY);
+               retVal = bind(my->fd, &my->spec.sa, sizeof(my->spec.sa));
+               my->spec.sa.sin_family = AF_INET;
+               my->spec.sa.sin_port = port;
+               my->spec.sa.sin_addr.s_addr = addr;
        }
+       my->mtuSize = 8192;
 
        if (0 > retVal) {
-               syslog(LOG_DEBUG, "openAtm: %s", strerror(errno));
+               syslog(LOG_DEBUG, "openUdp: %s", strerror(errno));
        }
        return retVal;
 }
@@ -90,17 +73,17 @@ static int openAtm(NetTrans *my, int vpi, int vci, size_t bw, int fl)
        syslog(LOG_DEBUG, "aal: %d; vpi: %d; vci: %d; bandwidth: %d",
                   lAtmAttr->aal, lAtmAttr->vpi, lAtmAttr->vci, lAtmAttr->peakBandwidth);
 
-       my->lAtm = newLAtm("/dev/fa0", fl);
+       my->spec.lAtm = newLAtm("/dev/fa0", fl);
 
-       if (NULL == my->lAtm) {
+       if (NULL == my->spec.lAtm) {
                retVal = -1;
        } else {
                switch (fl) {
                case O_RDONLY:
-                       retVal = LAtm_bind(my->lAtm, lAtmAttr);
+                       retVal = LAtm_bind(my->spec.lAtm, lAtmAttr);
                        break;
                case O_WRONLY:
-                       retVal = LAtm_connect(my->lAtm, lAtmAttr);
+                       retVal = LAtm_connect(my->spec.lAtm, lAtmAttr);
                        break;
                default:
                        errno = EINVAL;
@@ -109,10 +92,10 @@ static int openAtm(NetTrans *my, int vpi, int vci, size_t bw, int fl)
                }
 
                if (0 > retVal) {
-                       deleteLAtm(my->lAtm);
+                       deleteLAtm(my->spec.lAtm);
                } else {
                        my->mtuSize = 60 * 0x400;
-                       my->fd = LAtm_fd(my->lAtm);
+                       my->fd = LAtm_fd(my->spec.lAtm);
                }
        }
 
@@ -149,7 +132,8 @@ int openGeneric(NetTrans *my, const char *name, int flags, size_t bandwidth)
                        int port;
 
                        addr = inet_addr(pa);
-                       port = atoi(ep);
+                       fprintf(stderr, "%d\n", addr);
+                       port = htons(atoi(ep));
                        my->type = NetTransType_udp;
                        retVal = openUdp(my, addr, port, flags);
                } else {
@@ -173,7 +157,7 @@ int closeGeneric(NetTrans *my)
 
        switch (my->type) {
        case NetTransType_atm:
-               deleteLAtm(my->lAtm);
+               deleteLAtm(my->spec.lAtm);
                retVal = 0;
                break;
        case NetTransType_udp:
@@ -191,17 +175,19 @@ int closeGeneric(NetTrans *my)
 int sendGeneric(NetTrans *my)
 {
        int retVal;
+       socklen_t socklen = sizeof(my->spec.sa);
 
        assert(NetTrans_invariant(my));
 
        switch (my->type) {
        case NetTransType_atm:
-               retVal = LAtm_send(my->lAtm, my->pkt, my->pktSize);
+               retVal = LAtm_send(my->spec.lAtm, my->pkt, my->pktSize);
                if (0 > retVal) {
                        LAtm_perror("LAtm_send");
                }
                break;
        case NetTransType_udp:
+               retVal = sendto(my->fd, my->pkt, my->pktSize, 0, &my->spec.sa, socklen);
 #if 0                                                  /* This limits the output data rate to 100 * mtuSize / s */
                {
                        static int i = 0;
@@ -213,7 +199,6 @@ int sendGeneric(NetTrans *my)
                        }
                }
 #endif
-               retVal = send(my->fd, my->pkt, my->pktSize, 0);
                break;
        }
 
@@ -229,15 +214,16 @@ int sendGeneric(NetTrans *my)
 int recvGeneric(NetTrans *my)
 {
        int retVal;
+       socklen_t socklen = sizeof(my->spec.sa);
 
        assert(NetTrans_invariant(my));
 
        switch (my->type) {
        case NetTransType_atm:
-               retVal = LAtm_recv(my->lAtm, my->pkt, my->mtuSize);
+               retVal = LAtm_recv(my->spec.lAtm, my->pkt, my->mtuSize);
                break;
        case NetTransType_udp:
-               retVal = recv(my->fd, my->pkt, my->mtuSize, 0);
+               retVal = recvfrom(my->fd, my->pkt, my->mtuSize, 0, &my->spec.sa, &socklen);
                break;
        }
 
@@ -251,10 +237,8 @@ int recvGeneric(NetTrans *my)
 
 int NetTrans_invariant(const NetTrans *my)
 {
-       return (
-                          my != NULL
-                          && (my->type == NetTransType_atm || my->type == NetTransType_udp)
-       );
+       return (my != NULL && (my->type == NetTransType_atm || my->type == NetTransType_udp)
+               );
 }
 
 NetTrans *NetTrans_create(const char *name, size_t bandwidth, Worker *worker)
index 5620011569c37d0af67b54cc8af7def28e0a7c61..e60d9d2a59f682c17e550c6fef5f19a88a970ccb 100644 (file)
@@ -3,6 +3,9 @@
 #define NETTRANS_H
 
 #include <latm.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/types.h>
 
 #include "worker.h"
 #include "hadtu.h"
@@ -16,7 +19,10 @@ typedef enum NetTransTypeE {
 typedef struct NetTransS {
        char name[512];
        NetTransType type;
-       LAtm *lAtm;
+       union {
+               LAtm *lAtm;
+               struct sockaddr_in sa;
+       } spec;
        size_t mtuSize;
        int fd;
        void *pkt;
@@ -30,9 +36,7 @@ typedef struct NetTransS {
        unsigned long *msgsReceived;
        unsigned long *msgsDiscarded;
        unsigned long *bytesReceived;
-}
-
-NetTrans;
+} NetTrans;
 
 int NetTrans_invariant(const NetTrans *my);
 NetTrans *NetTrans_create(const char *name, size_t bandwidth, Worker *worker);