#include #include #include #include #include #include #include #include #include #include #define PORT 12345 #define BUFFER_SIZE 1024 int main(void) { char buffer[BUFFER_SIZE]; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int server_fd, client_fd, client_len; fd_set read_fds, write_fds; int r, bytes = 0; int in = 1, out = 0; int offset = 0; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = INADDR_ANY; if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("Can't create socket\n"); exit(0); } if(bind(server_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) { printf("Can't bind socket\n"); exit(0); } if(listen(server_fd, 1) < 0) { printf("Can't listen on socket\n"); exit(0); } client_len = sizeof(client_addr); client_fd = accept(server_fd, (struct sockaddr *) &client_addr, &client_len); if(client_fd < 0) { printf("Can't accept connection\n"); exit(0); } close(server_fd); fcntl(client_fd, F_SETFL, fcntl(client_fd, F_GETFL) | O_NONBLOCK); while(1) { FD_ZERO(&read_fds); FD_ZERO(&write_fds); if (in) FD_SET(client_fd, &read_fds); if (out) FD_SET(client_fd, &write_fds); r = select(client_fd + 1, &read_fds, &write_fds, NULL, NULL); if (r < 0) { if (errno == EINTR) continue; goto END; } if (FD_ISSET(client_fd, &read_fds)) { bytes = read(client_fd, buffer, BUFFER_SIZE); offset = 0; if (bytes <= 0) { goto END; } else FD_SET(client_fd, &write_fds); } if (FD_ISSET(client_fd, &write_fds)) { r = write(client_fd, buffer + offset, bytes); offset += r; bytes -= r; if (bytes == 0) { in = 1; out = 0; } else { in = 0; out = 1; } } } END: close(client_fd); printf("Finished...\n"); return 0; }