X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=src%2Fnetwork.c;h=bcd06d4aeb0d426ba10409e56fe984b935fba8f4;hb=4e2127d6576cea3f54c619d0bb20a22006567206;hp=5354ac353398b334b46c3336a172b5a469a9e863;hpb=3237855ae8604fb19d058eef2797c850b37f5596;p=matches%2Fswarm.git diff --git a/src/network.c b/src/network.c index 5354ac3..bcd06d4 100644 --- a/src/network.c +++ b/src/network.c @@ -6,9 +6,21 @@ #define h_addr h_addr_list[0] -int Network_server(int port) {return Network_server_r(NULL, port);} -int Network_server_r(char * addr, int port) + + + +int Network_get_port(int sfd) +{ + static struct sockaddr_in sin; + static socklen_t len = sizeof(struct sockaddr_in); + + if (getsockname(sfd, (struct sockaddr *)&sin, &len) != 0) + error("Network_port", "getsockname : %s", strerror(errno)); + return ntohs(sin.sin_port); +} + +int Network_server_bind(int port, int * bound) { int sfd = socket(PF_INET, SOCK_STREAM, 0); if (sfd < 0) @@ -26,6 +38,15 @@ int Network_server_r(char * addr, int port) { error("Network_server", "Binding socket on port %d : %s", port, strerror(errno)); } + + if (bound != NULL) + *bound = Network_get_port(sfd); + return sfd; +} + +int Network_server_listen(int sfd, char * addr) +{ + int port = Network_get_port(sfd); if (listen(sfd, 1) < 0) { error("Network_server", "Listening on port %d : %s", port, strerror(errno)); @@ -52,12 +73,18 @@ int Network_server_r(char * addr, int port) assert(sfd >= 0); return sfd; - +} + +int Network_server(char * addr, int port) +{ + return Network_server_listen(Network_server_bind(port, &port), addr); } int Network_client(const char * addr, int port, int timeout) { int sfd = socket(PF_INET, SOCK_STREAM, 0); + + //log_print(2, "Network_client", "Created socket"); long arg = fcntl(sfd, F_GETFL, NULL); arg |= O_NONBLOCK; fcntl(sfd, F_SETFL, arg); @@ -75,6 +102,7 @@ int Network_client(const char * addr, int port, int timeout) bcopy ( hp->h_addr, &(server.sin_addr.s_addr), hp->h_length); server.sin_port = htons(port); + int res = connect(sfd, (struct sockaddr *) &server, sizeof(server)); @@ -91,9 +119,9 @@ int Network_client(const char * addr, int port, int timeout) struct timeval * tp; tp = (timeout < 0) ? NULL : &tv; - + int err = select(sfd+1, NULL, &writeSet, NULL, tp); - + if (err == 0) { error("Network_client", "Timed out trying to connect to %s:%d after %d seconds", addr, port, timeout); @@ -126,7 +154,8 @@ int Network_client(const char * addr, int port, int timeout) arg &= (~O_NONBLOCK); fcntl(sfd, F_SETFL, arg); - + + return sfd; }