6 #include <netinet/in.h>
8 #include <sys/socket.h>
12 #include "lib_swift.h"
14 struct sockSwiftaddr transformFromAddrToSwift(struct listsockaddr lsa)
16 struct sockSwiftaddr ssa;
19 for (i = 0; i < lsa.N; i++)
21 ssa.sin_addr.s_addr[i] = lsa.sa[i].sin_addr.s_addr;
27 struct listsockaddr transformFromSwiftToAddr(struct sockSwiftaddr ssa)
29 struct listsockaddr lsa;
32 lsa.N = ssa.sin_addr.N;
34 for ( i = 0; i < lsa.N; i++) {
35 lsa.sa[i].sin_family = ssa.sin_family;
36 lsa.sa[i].sin_port = ssa.sin_port;
37 lsa.sa[i].sin_addr.s_addr = ssa.sin_addr.s_addr[i];
43 // Function to receive a message
44 ssize_t recvfromSwift(Swift s, void *buf, size_t len, int flags,
45 struct sockSwiftaddr *from, socklen_t fromlen)
47 struct sockaddr s_other;
48 socklen_t slen=sizeof(s_other);
49 ssize_t rec = -1, send;
50 char *command = "test";
51 struct listsockaddr lsa = transformFromSwiftToAddr(*from);
54 Dprintf("create recv channel\n");
56 if (s->usedChannels < s->maxChannels)
58 channel = s->usedChannels++;
59 CHECK(s->recvChannel[channel] = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP));
61 for ( i = 0 ; i < lsa.N ; i++)
63 Dprintf("send information to %s\n", inet_ntoa(lsa.sa[0].sin_addr));
64 send = sendto(s->recvChannel[channel], command, strlen(command), 0, (const struct sockaddr *)&lsa.sa[i], sizeof(lsa.sa[i]));
67 Dprintf("receive data\n");
68 // I'm waiting for response
69 rec = recvfrom(s->recvChannel[channel], buf, len, flags, (struct sockaddr * __restrict__)&s_other, &slen);
71 close(s->recvChannel[channel]);
77 // Function to send a message
78 ssize_t sendToSwift(Swift s, const void *buf, size_t len, int flags,
79 const struct sockSwiftaddr *to, socklen_t tolen)
81 struct listsockaddr lsa = transformFromSwiftToAddr(*to);
85 Dprintf("send data\n");
86 for ( i = 0 ; i < lsa.N ; i++)
88 send = sendto(s->sendChannel, buf, len, flags, (const struct sockaddr *)&lsa.sa[i], sizeof(lsa.sa[i]));
93 // Function to listen to a port
94 int listenfromSwift (Swift s, void *buf, size_t len, int flags,
95 struct sockSwiftaddr * __restrict__ from, socklen_t *fromlen)
97 struct sockaddr s_other;
98 struct listsockaddr lsa;
99 socklen_t slen=sizeof(s_other);
102 Dprintf("wait to receive messages\n");
104 rec = recvfrom(s->socketListener, buf, len, flags, (struct sockaddr * __restrict__)&s_other, &slen);
107 memcpy(&lsa.sa[0], &s_other, sizeof(s_other));
110 *from = transformFromAddrToSwift(lsa);
115 // Function to bind a port for swift socket
116 int bindSwift(Swift s, const struct sockSwiftaddr *my_addr, socklen_t addrlen)
118 Dprintf("bind swift socket\n");
119 struct listsockaddr lsa = transformFromSwiftToAddr(*my_addr);
121 return bind(s->socketListener, (const struct sockaddr *)&lsa.sa[0], sizeof(lsa.sa[0]));
124 // Function to create a Swift socket
125 Swift socketSwift(int maxChannels)
127 Dprintf("create struct swift\n");
128 Swift s = calloc(1,sizeof(*s));
130 Dprintf("create swift socket listener\n");
131 CHECK(s->socketListener = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP));
133 Dprintf("create swift send channel\n");
134 CHECK(s->sendChannel = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP));
140 void closeSwift(Swift s)
142 Dprintf("close swift socket\n");
143 close(s->socketListener);
144 close(s->sendChannel);