Things seem to work...
[matches/swarm.git] / src / network.c
index 5354ac3..bcd06d4 100644 (file)
@@ -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;
 }
 

UCC git Repository :: git.ucc.asn.au