Update:
authorBogdan Drutu <bgodandrutu@gmail.com>
Fri, 1 Apr 2011 20:42:07 +0000 (23:42 +0300)
committerRazvan Deaconescu <razvan.deaconescu@cs.pub.ro>
Sat, 2 Apr 2011 07:27:23 +0000 (10:27 +0300)
- complete api
- add a client/server example

src/client.c
src/lib_swift.c
src/lib_swift.h
src/server.c

index 4fdfecc..8988295 100644 (file)
@@ -13,6 +13,7 @@ int main()
        Swift s = socketSwift(1);
        struct sockSwiftaddr my_addr;
        char buf[100];
+       struct listsockaddr lsa;
        
        // populate sockSwiftaddr
        my_addr.sin_family = AF_INET;
@@ -22,7 +23,7 @@ int main()
        
        recvfromSwift(s, buf, 100, 0, &my_addr, sizeof(my_addr));
        
-       struct listsockaddr lsa =  transformFromSwiftToAddr(my_addr);
+       transformFromSwiftToAddr(&lsa, my_addr);
        printf("Received packet from %s:%d\nData: %s\n\n", inet_ntoa(lsa.sa[0].sin_addr), ntohs(my_addr.sin_port), buf);
        
        closeSwift(s);
index d26a208..7305234 100644 (file)
 #define DEBUG
 #include "lib_swift.h"
 
-struct sockSwiftaddr transformFromAddrToSwift(struct listsockaddr lsa)
+void transformFromAddrToSwift(struct sockSwiftaddr *ssa, struct listsockaddr lsa)
 {
-       struct sockSwiftaddr ssa;
        int i;
        
+       Dprintf("transform in %d address\n", lsa.N);    
+       ssa->sin_addr.N = lsa.N;
+       if (lsa.N > 0) {
+               ssa->sin_family = lsa.sa[0].sin_family;
+               ssa->sin_port = lsa.sa[0].sin_port;
+       }
+       
        for (i = 0; i < lsa.N; i++)
        {
-               ssa.sin_addr.s_addr[i] = lsa.sa[i].sin_addr.s_addr;
+               ssa->sin_addr.s_addr[i] = lsa.sa[i].sin_addr.s_addr;
        }
-       
-       return ssa;
 }
 
-struct listsockaddr transformFromSwiftToAddr(struct sockSwiftaddr ssa)
+void transformFromSwiftToAddr(struct listsockaddr *lsa, struct sockSwiftaddr ssa)
 {
-       struct listsockaddr lsa;
        int i;
        
-       lsa.N = ssa.sin_addr.N;
+       Dprintf("transform %d address\n", ssa.sin_addr.N);
+       lsa->N = ssa.sin_addr.N;
        
-       for ( i = 0; i < lsa.N; i++) {
-               lsa.sa[i].sin_family = ssa.sin_family;
-               lsa.sa[i].sin_port = ssa.sin_port;
-               lsa.sa[i].sin_addr.s_addr = ssa.sin_addr.s_addr[i];
+       for ( i = 0; i < lsa->N; i++) {
+               lsa->sa[i].sin_family = ssa.sin_family;
+               lsa->sa[i].sin_port = ssa.sin_port;
+               lsa->sa[i].sin_addr.s_addr = ssa.sin_addr.s_addr[i];
        }
-       
-       return lsa;
 }
 
 // Function to receive a message
@@ -48,9 +50,10 @@ ssize_t recvfromSwift(Swift s, void *buf, size_t len, int flags,
        socklen_t slen=sizeof(s_other); 
        ssize_t rec = -1, send;
        char *command = "test";
-       struct listsockaddr lsa =  transformFromSwiftToAddr(*from);
+       struct listsockaddr lsa;
        int i, channel;
        
+       transformFromSwiftToAddr(&lsa, *from);
        Dprintf("create recv channel\n");       
        // TODO make pool
        if (s->usedChannels < s->maxChannels) 
@@ -60,11 +63,12 @@ ssize_t recvfromSwift(Swift s, void *buf, size_t len, int flags,
 
                for ( i = 0 ; i < lsa.N ; i++) 
                {
-                       Dprintf("send information to %s\n", inet_ntoa(lsa.sa[0].sin_addr));                     
-                       send = sendto(s->recvChannel[channel], command, strlen(command), 0, (const struct sockaddr *)&lsa.sa[i], sizeof(lsa.sa[i]));
+                       Dprintf("send information to %s:%d\n", inet_ntoa(lsa.sa[i].sin_addr), ntohs(lsa.sa[i].sin_port));                       
+                       send = sendto(s->recvChannel[channel], command, 4, 0, (const struct sockaddr *)&lsa.sa[i], sizeof(lsa.sa[i]));
                }
                
                Dprintf("receive data\n");
+               // TODO make a non-blocant select
                // I'm waiting for response
                rec = recvfrom(s->recvChannel[channel], buf, len, flags,  (struct sockaddr * __restrict__)&s_other, &slen);             
        
@@ -78,13 +82,15 @@ ssize_t recvfromSwift(Swift s, void *buf, size_t len, int flags,
 ssize_t sendToSwift(Swift s, const void *buf, size_t len, int flags, 
                                        const struct sockSwiftaddr *to, socklen_t tolen) 
 {
-       struct listsockaddr lsa =  transformFromSwiftToAddr(*to);
+       struct listsockaddr lsa;
        int i;
        ssize_t send = -1;
        
-       Dprintf("send data\n");
+       transformFromSwiftToAddr(&lsa, *to);
+       
        for ( i = 0 ; i < lsa.N ; i++) 
        {
+               Dprintf("send data to %s:%d\n", inet_ntoa(lsa.sa[i].sin_addr), ntohs(lsa.sa[i].sin_port));
                send = sendto(s->sendChannel, buf, len, flags, (const struct sockaddr *)&lsa.sa[i], sizeof(lsa.sa[i]));
        }
        
@@ -92,7 +98,7 @@ ssize_t sendToSwift(Swift s, const void *buf, size_t len, int flags,
 }
 // Function to listen to a port
 int listenfromSwift (Swift s, void *buf, size_t len, int flags,
-                                        struct sockSwiftaddr * __restrict__ from, socklen_t *fromlen) 
+                                        struct sockSwiftaddr * from, socklen_t *fromlen) 
 {
        struct sockaddr s_other;
        struct listsockaddr lsa;
@@ -107,7 +113,7 @@ int listenfromSwift (Swift s, void *buf, size_t len, int flags,
        memcpy(&lsa.sa[0], &s_other, sizeof(s_other));
        lsa.N = 1;
        
-       *from = transformFromAddrToSwift(lsa);
+       transformFromAddrToSwift(from, lsa);
        
        return rec;
 }
@@ -116,7 +122,8 @@ int listenfromSwift (Swift s, void *buf, size_t len, int flags,
 int bindSwift(Swift s, const struct sockSwiftaddr *my_addr, socklen_t addrlen)
 {
        Dprintf("bind swift socket\n");
-       struct listsockaddr lsa = transformFromSwiftToAddr(*my_addr);
+       struct listsockaddr lsa;
+       transformFromSwiftToAddr(&lsa, *my_addr);
                
        return bind(s->socketListener, (const struct sockaddr *)&lsa.sa[0], sizeof(lsa.sa[0]));
 }
@@ -133,6 +140,12 @@ Swift socketSwift(int maxChannels)
        Dprintf("create swift send channel\n"); 
        CHECK(s->sendChannel = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP));
 
+       Dprintf("create swift send channel\n"); 
+       CHECK(s->recvChannel = calloc(100,sizeof(SOCKET)));
+       
+       s->usedChannels = 0;
+       s->maxChannels = maxChannels;
+       
        return s;
 }
 
index 3062195..c871789 100644 (file)
 #define Dprintf(msg,...)                /* do nothing */
 #endif
 
+typedef int SOCKET;
+
 // swift interface
 typedef struct swift {
-       int socketListener;
-       int sendChannel;
-       int *recvChannel;
+       SOCKET socketListener;
+       SOCKET sendChannel;
+       SOCKET *recvChannel;
        
        int usedChannels;
        int maxChannels;
@@ -79,7 +81,7 @@ ssize_t sendToSwift(Swift s, const void *buf, size_t len, int flags,
 
 
 // test function -- don't commit
-struct sockSwiftaddr transformFromAddrToSwift(struct listsockaddr lsa);
-struct listsockaddr transformFromSwiftToAddr(struct sockSwiftaddr ssa);
+void transformFromAddrToSwift(struct sockSwiftaddr *ssa, struct listsockaddr lsa);
+void transformFromSwiftToAddr(struct listsockaddr *lsa, struct sockSwiftaddr ssa);
 
 #endif
index 2001f8a..d293d24 100644 (file)
@@ -15,6 +15,7 @@ int main()
        char buf[100];
        socklen_t slen;
        struct listsockaddr lsa;
+       ssize_t len;
        
        // populate sockSwiftaddr
        my_addr.sin_family = AF_INET;
@@ -25,11 +26,11 @@ int main()
        //recvfromSwift(s, buf, 100, 0, (struct sockaddr *)&si_other, &slen);
        
        bindSwift(s, &my_addr, sizeof(my_addr));
-       listenfromSwift(s, buf, 100, 0, &from, &slen);
-       
-       lsa =  transformFromSwiftToAddr(from);
-       printf("Received packet from %s:%d with data: %s\n", inet_ntoa(lsa.sa[0].sin_addr), ntohs(lsa.sa[0].sin_port), buf);
+       len = listenfromSwift(s, buf, 100, 0, &from, &slen);
+       transformFromSwiftToAddr(&lsa, from);
+       printf("Received packet from %s:%d with data: %s %d\n", inet_ntoa(lsa.sa[0].sin_addr), ntohs(lsa.sa[0].sin_port), buf, (int)len);
        
+       sendToSwift(s, buf, len, 0, &from, slen);
        
        closeSwift(s);
        return 0;