I am using Berkeley sockets (both: Internet domain and Unix domain) and I was wondering if the server can use the same sockets for reading the request and writing a response to the client. Or should the client create an other socket to wait for the replay and the server connect to it after processing the message received.
By the way, I am talking about connection oriented sockets (stream sockets, TCP, …).
This is the simplified server code (I ommit error checking on system calls here just for simplicity):
int main() { int server_socket, connected_socket; struct sockaddr_in server_addr; char buf[1024]; char aux[256]; int bytes_read; server_socket = socket(AF_INET, SOCK_STREAM, 0); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(1234); bind(server_socket, &server_addr, sizeof(server_addr)) listen(server_socket, 5) connected_sodket = accept(server_socket, 0, 0); do { bzero(buf, sizeof(buf)); bytes_read = read(connected_socket, buf, sizeof(buf)); } while (bytes_read > 0); /* Here I want to use connected_socket to write the reply, can I? */ close(connected_socket); close(server_socket); return (EXIT_SUCCESS); }
And this is the simplified client code (I ommit error checking on system calls here just for simplicity):
int main() { int client_socket; struct sockaddr_in server_addr; client_socket = socket(AF_INET, SOCK_STREAM, 0); hp = gethostbyname('myhost'); server_addr.sin_family = AF_INET; memcpy(&server_addr.sin_addr, hp->h_addr_list[0], hp->h_length); server_addr.sin_port = htons(1234); connect(client_socket, &server_addr, sizeof(server_addr)); write(client_socket, MSG, sizeof(MSG)); /* Here I want to wait for a response from the server using client_socket, can I? */ close(client_socket); return (EXIT_SUCCESS); }
Can I use connected_socket in the server and client_socket in the client to pass a response message back? Or should I use the client address I get in the server when in ‘accept’ to connect to a socket in the client?
I have tried by using read/wrint in the client/server where the comment is shown but that way both programs keep blocked, it seems to be a dead-lock.
Thanks ins advance! Regards.
You can use the same socket BUT your program is set up to have the server read EVERYTHING the client sends before attempting to reply. So the loop in the server won’t complete until the client closes the write side of its socket so the server gets an EOF (0 bytes read), and thus the server will never send back its response.
There are a couple of ways you can deal with this.
shutdown(client_socket, SHUT_WR)to half-close the socket. The server will then see the EOF (and the loop will finish), but the other direction on the socket will still be open for the reply.