#include #include #include #include #include #define PORT 2500 #define xerror(str) do { perror(str); exit(1); } while (0) int main(void) { struct sockaddr_in sa; int l, s, tmp; int t = 0; memset(&sa, 0, sizeof(sa)); l = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (!l) xerror("socket"); sa.sin_family = AF_INET; sa.sin_addr.s_addr = htonl(INADDR_ANY); sa.sin_port = htons(PORT); tmp = 1; setsockopt(l, SOL_SOCKET, SO_REUSEADDR, (char*)&tmp, sizeof(tmp)); if (bind(l, (struct sockaddr*)&sa, sizeof(sa)) != 0) xerror("bind"); if (listen(l, 0) != 0) xerror("listen"); printf("server %d ready...\n", getpid()); for (t = 1; t <= 2; t++) { s = accept(l, NULL, NULL); switch (fork()) { case -1: xerror("fork"); break; case 0: switch (t) { case 1: printf("server %d accepted connection\n", getpid()); #if 0 tmp = fcntl(s, F_GETFL, 0); if (fcntl(s, F_SETFL, tmp | O_NONBLOCK) != 0) xerror("fcntl"); if (send(s, "AAAAAAA", 7, 0) != 7) xerror("send"); #endif printf("server %d waiting for 1 second...\n", getpid()); sleep(1); printf("server %d closing connection\n", getpid()); close(s); return 0; break; case 2: printf("server %d accepted connection\n", getpid()); printf("server %d waiting for 10 seconds...\n", getpid()); sleep(10); printf("server %d closing connection\n", getpid()); close(s); return 0; break; } break; default: close(s); } } wait(NULL); wait(NULL); return 0; }