#include #include #include #include #include #include #include #include #include char buf[1024]; int main() { int fd; char * ptr; struct sockaddr_in addr; int ready = 0; fd_set rfds, efds; int nread; /* establish connection */ fd = socket (PF_INET, SOCK_STREAM, 0); if ( -1 == fd) { perror ("socket"); exit (1); } addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl (INADDR_ANY); addr.sin_port = 0; if (bind (fd, (struct sockaddr*)&addr, sizeof (struct sockaddr_in)) != 0) { perror ("bind"); exit (1); } ptr = (char*)&addr.sin_addr.s_addr; /* ptr[0] = 162; ptr[1] = 0; ptr[2] = 120; ptr[3] = 98;*/ ptr[0] = 127; ptr[1] = 0; ptr[2] = 0; ptr[3] = 1; addr.sin_port = htons(9999); if (connect (fd, (struct sockaddr*)&addr, sizeof(addr)) != 0) { perror ("connect"); exit (1); } FD_ZERO (&rfds); FD_SET (fd, &rfds); select (fd+1, &rfds, 0, 0, 0); /* read everything from socket and print it to stdout */ while (!ready) { struct timeval tv; FD_ZERO (&rfds); FD_SET (fd, &rfds); FD_ZERO (&efds); FD_SET (fd, &efds); memset (&tv, 0, sizeof(tv)); switch (select (fd+1, &rfds, 0, &efds, &tv)) { case -1: perror("select"); exit (1); case 0: ready = 1; break; case 1: if (FD_ISSET (fd, &efds)) { fprintf (stderr, "select found exception"); } nread = read (fd, &buf, 1024); if (nread == 0) ready = 1; else write (1, &buf, nread); break; } } /* here lsof will show CLOSE_WAIT */ raise (SIGSTOP); { int ret; if ((ret = write (fd, "QUIT\n", 5)) == -1) { perror ("write"); exit (1); } printf("write ok, ret=%d\n", ret); } /* here the socket is orphaned, after write succeeded */ raise (SIGSTOP); return 0; }