#define _GNU_SOURCE 1 #include #include #include #include #include #include #include #include #define PORT 5000 int main (void) { struct sockaddr_in sockaddr; socklen_t tmp; int listen_fd, send_fd, recv_fd; char charbuf; ssize_t ssize; int i; setbuf (stdout, NULL); /* bind/listen. */ errno = 0; listen_fd = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP); assert (listen_fd != -1); sockaddr.sin_family = PF_INET; sockaddr.sin_port = htons (PORT); sockaddr.sin_addr.s_addr = INADDR_ANY; if (bind (listen_fd, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) || listen (listen_fd, 1)) perror ("Can't bind address"); /* Connect. */ send_fd = socket (PF_INET,SOCK_STREAM, 0); assert (send_fd != -1); memset (&sockaddr, 0, sizeof sockaddr); sockaddr.sin_family = AF_INET; sockaddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); sockaddr.sin_port = htons (PORT); i = connect (send_fd, (struct sockaddr *) &sockaddr, sizeof (sockaddr)); assert (i == 0); /* Accept. */ tmp = sizeof (sockaddr); recv_fd = accept (listen_fd, (struct sockaddr *) &sockaddr, &tmp); assert (recv_fd != -1); /* Send. */ charbuf = 'a'; ssize = send (send_fd, &charbuf, 1, 0); assert (ssize == 1); /* Now that data has been queued, close the receiving end. */ fputs ("sleeping ...", stdout); sleep (1); fputs (" closing ...", stdout); close (recv_fd); sleep (1); puts (" done"); /* Try sending again. */ charbuf = 'b'; errno = 0; ssize = send (send_fd, &charbuf, 1, 0); assert_perror (errno); assert (ssize == 1); puts ("send ok"); return 0; }