Okay, this has been bugging me for days. I have set up a simple client and server program on this computer (running Ubuntu 6.10). The client connects, receives some data, then disconnects. After this, if the server attempts to send data, the send() function returns like normal as if the data has been sent without error. If I again try sending data, the program crashes with a SIGPIPE signal. The original program is much more complex, so I wrote an extremely simple test case. Here's everything:
Also, when using gdb:Code:marc@Laptop01:~/Programming/tcptest$ cat server.c #include <stdio.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <unistd.h> #include <pthread.h> #include <errno.h> int main() { int listener, sd; struct sockaddr_in clientaddr, serveraddr; socklen_t clientaddrlen; int n; printf("Server: Creating listener socket...\n"); listener = socket(AF_INET, SOCK_STREAM, 0); if(listener < 0) { printf("Server: Error - %i\n", errno); return 1; } printf("Server: Listener created\n"); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); serveraddr.sin_port = htons(62921); printf("Server: Binding socket...\n"); if(bind(listener, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) { printf("Server: Error - %i\n", errno); return 1; } printf("Server: Socket bound\n"); listen(listener, 5); printf("Server: Listening...\n"); clientaddrlen = sizeof(clientaddr); printf("Server: Waiting for connection...\n"); sd = accept(listener, NULL, 0); if(sd < 0) { printf("Server: Error - %i\n", errno); return 1; } printf("Server: Connected\n"); printf("Server: Sending data...\n"); if((n = send(sd, "test", 5, 0)) < 0) { printf("Server: Error - %i\n", errno); return 1; } printf("Server: Data sent [%i]\n", n); sleep(1); printf("Server: Sending data...\n"); if((n = send(sd, "test", 5, 0)) < 0) { printf("Server: Error - %i\n", errno); return 1; } printf("Server: Data sent [%i]\n", n); printf("Server: Sending data...\n"); if((n = send(sd, "test", 5, 0)) < 0) { printf("Server: Error - %i\n", errno); return 1; } printf("Server: Data sent [%i]\n", n); printf("Server: Closing\n"); close(sd); close(listener); printf("Server: Closed\n"); return 0; } marc@Laptop01:~/Programming/tcptest$ cat client.c #include <stdio.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <unistd.h> #include <pthread.h> #include <errno.h> #define MAX_LINE 100 #define LINE_ARRAY_SIZE (MAX_LINE+1) int main() { int sd; struct sockaddr_in serveraddr; struct hostent* hostinfo; char buf[256]; sleep(5); printf("Client: Retrieving host information...\n"); hostinfo = gethostbyname("127.0.0.1"); if(hostinfo == NULL) { printf("Client: Error - %i\n", errno); return 1; } printf("Client: Received\n"); printf("Client: Creating socket...\n"); sd = socket(AF_INET, SOCK_STREAM, 0); if(sd < 0) { printf("Client: Error - %i\n", errno); return 1; } printf("Client: Socket created\n"); serveraddr.sin_family = hostinfo->h_addrtype; serveraddr.sin_addr.s_addr = *((u_long*)hostinfo->h_addr_list[0]); serveraddr.sin_port = htons(62921); printf("Client: Connecting...\n"); if(connect(sd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr_in)) < 0) { printf("Client: Error - %i\n", errno); return 1; } printf("Client: Connected\n"); printf("Client: Receiving data...\n"); if(recv(sd, buf, 5, 0) < 0) { printf("Client: Error - %i\n", errno); return 1; } printf("Client: Data received\n"); printf("Client: Closing connection...\n"); close(sd); printf("Client: Closed\n"); return 0; } marc@Laptop01:~/Programming/tcptest$ ./client & [1] 6314 marc@Laptop01:~/Programming/tcptest$ ./server Server: Creating listener socket... Server: Listener created Server: Binding socket... Server: Socket bound Server: Listening... Server: Waiting for connection... Client: Retrieving host information... Client: Received Client: Creating socket... Client: Socket created Client: Connecting... Client: Connected Client: Receiving data... Server: Connected Server: Sending data... Server: Data sent [5] Client: Data received Client: Closing connection... Client: Closed Server: Sending data... Server: Data sent [5] Server: Sending data... [1]+ Done ./client marc@Laptop01:~/Programming/tcptest$
Now, I've scoured the Internet trying to find a solution, but everything seems to claim that if I were to send to a closed socket (as I'm doing), it should return an EPIPE signal... but I'm not getting that. So... where is it?Code:(gdb) run Starting program: /home/marc/Programming/tcptest/server Server: Creating listener socket... Server: Listener created Server: Binding socket... Server: Socket bound Server: Listening... Server: Waiting for connection... Server: Connected Server: Sending data... Server: Data sent [5] Server: Sending data... Server: Data sent [5] Server: Sending data... Program received signal SIGPIPE, Broken pipe. 0xffffe410 in __kernel_vsyscall () (gdb) where #0 0xffffe410 in __kernel_vsyscall () #1 0xb7f56531 in send () from /lib/tls/i686/cmov/libc.so.6 #2 0x080488ca in main ()
~ Marc



LinkBack URL
About LinkBacks


