4 #include <sys/select.h>
7 #define h_addr h_addr_list[0]
9 int Network_server(int port) {return Network_server_r(NULL, port);}
11 int Network_server_r(char * addr, int port)
13 int sfd = socket(PF_INET, SOCK_STREAM, 0);
16 error("Network_server", "Creating socket on port %d : %s", port, strerror(errno));
19 struct sockaddr_in name;
21 name.sin_family = AF_INET;
22 name.sin_addr.s_addr = htonl(INADDR_ANY);
23 name.sin_port = htons(port);
25 if (bind( sfd, (struct sockaddr *) &name, sizeof(name) ) < 0)
27 error("Network_server", "Binding socket on port %d : %s", port, strerror(errno));
29 if (listen(sfd, 1) < 0)
31 error("Network_server", "Listening on port %d : %s", port, strerror(errno));
36 psd = accept(sfd, 0, 0);
39 struct sockaddr_in client;
42 client.sin_family = AF_INET;
43 hp = gethostbyname(addr);
44 bcopy ( hp->h_addr, &(client.sin_addr.s_addr), hp->h_length);
45 client.sin_port = htons(port);
46 socklen_t len = sizeof(client);
48 psd = accept(sfd, (struct sockaddr*)&client, &len);
58 int Network_client(const char * addr, int port, int timeout)
60 int sfd = socket(PF_INET, SOCK_STREAM, 0);
61 long arg = fcntl(sfd, F_GETFL, NULL);
63 fcntl(sfd, F_SETFL, arg);
67 error("Network_client", "Creating socket for address %s:%d : %s", addr, port, strerror(errno));
69 struct sockaddr_in server;
73 server.sin_family = AF_INET;
74 hp = gethostbyname(addr);
75 bcopy ( hp->h_addr, &(server.sin_addr.s_addr), hp->h_length);
76 server.sin_port = htons(port);
78 int res = connect(sfd, (struct sockaddr *) &server, sizeof(server));
81 if (res < 0 && errno == EINPROGRESS)
86 FD_SET(sfd, &writeSet);
93 tp = (timeout < 0) ? NULL : &tv;
95 int err = select(sfd+1, NULL, &writeSet, NULL, tp);
99 error("Network_client", "Timed out trying to connect to %s:%d after %d seconds", addr, port, timeout);
103 error("Network_client", "Connecting to %s:%d - Error in select(2) call : %s", addr, port, strerror(errno));
105 else if (FD_ISSET(sfd, &writeSet))
108 socklen_t len = sizeof so_error;
109 getsockopt(sfd, SOL_SOCKET, SO_ERROR, &so_error, &len);
112 error("Network_client", "Connecting to %s:%d : %s", addr, port, strerror(so_error));
117 error("Network_client", "select(2) returned %d but the socket is not writable!?", err);
122 error("Network_client", "Connecting to %s:%d : %s", addr, port, strerror(errno));
125 arg = fcntl(sfd, F_GETFL, NULL);
126 arg &= (~O_NONBLOCK);
127 fcntl(sfd, F_SETFL, arg);
133 void Network_close(int sfd)
135 if (shutdown(sfd, 2) != 0)
137 error("Network_close", "Closing socket : %s", strerror(errno));