From 853f66028779d7efe0ef5e0e23f3afb8c1a8af52 Mon Sep 17 00:00:00 2001 From: Bogdan Drutu Date: Fri, 1 Apr 2011 23:42:07 +0300 Subject: [PATCH] Update: - complete api - add a client/server example --- src/client.c | 3 ++- src/lib_swift.c | 57 ++++++++++++++++++++++++++++++------------------- src/lib_swift.h | 12 ++++++----- src/server.c | 9 ++++---- 4 files changed, 49 insertions(+), 32 deletions(-) diff --git a/src/client.c b/src/client.c index 4fdfecc..8988295 100644 --- a/src/client.c +++ b/src/client.c @@ -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); diff --git a/src/lib_swift.c b/src/lib_swift.c index d26a208..7305234 100644 --- a/src/lib_swift.c +++ b/src/lib_swift.c @@ -11,33 +11,35 @@ #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; } diff --git a/src/lib_swift.h b/src/lib_swift.h index 3062195..c871789 100644 --- a/src/lib_swift.h +++ b/src/lib_swift.h @@ -27,11 +27,13 @@ #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 diff --git a/src/server.c b/src/server.c index 2001f8a..d293d24 100644 --- a/src/server.c +++ b/src/server.c @@ -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; -- 2.20.1