#include #include #include #include #include #include #include int main() { struct sockaddr_in r, q; int listenfd, clientfd; if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); } memset(&r, '\0', sizeof r); r.sin_family = AF_INET; r.sin_addr.s_addr = INADDR_ANY; r.sin_port = htons(1234); if (bind(listenfd, (struct sockaddr *)&r, sizeof r)) { perror("bind"); exit(1); } if (listen(listenfd, 5)) { perror("listen"); exit(1); } while (1) { char buf[30]; socklen_t len = sizeof q; if ((clientfd = accept(listenfd, (struct sockaddr *)&q, &len)) < 0) { perror("accept"); return(1); } while (1) { fd_set fdlist; int from, to, n; FD_ZERO(&fdlist); FD_SET(clientfd, &fdlist); FD_SET(0, &fdlist); if (select(clientfd+1, &fdlist, NULL, NULL, NULL) < 0) { perror("select"); exit(1); } if (FD_ISSET(0, &fdlist)) { from = 0; to = clientfd; } else { from = clientfd; to = 0; } if ((n = read(from, buf, sizeof buf)) < 0) { perror("read"); exit(1); } if (n == 0) break; if (write(to, buf, n) != n) { perror("write"); exit(1); } } close(clientfd); } }