#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)
{
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));
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);
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));
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);
arg &= (~O_NONBLOCK);
fcntl(sfd, F_SETFL, arg);
-
+
+
return sfd;
}