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:

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$
Also, when using gdb:
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 ()
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?

~ Marc