diff --git a/Topic-12/server.c b/Topic-12/server.c index 82b79ee..ec946e3 100644 --- a/Topic-12/server.c +++ b/Topic-12/server.c @@ -1,5 +1,60 @@ +#include +#include +#include +#include +#include +#include + +void handle_arguments(int argc, char *argv[]) { + if (argc != 2) { + fprintf(stderr, "Usage: %s PORT\n", argv[0]); + exit(EXIT_FAILURE); + } +} + void run_server(int port) { - + int sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) { + fprintf(stderr, "socket: "); + exit(EXIT_FAILURE); + } + + struct sockaddr_in serv_addr, client_addr; + socklen_t client_addr_len; + memset(&serv_addr, 0, sizeof(serv_addr)); + memset(&client_addr, 0, sizeof(client_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(port); + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + + int rv = bind(sockfd, (const struct sockaddr *)&serv_addr, sizeof(serv_addr)); + if (rv < 0) { + fprintf(stderr, "bind: "); + exit(EXIT_FAILURE); + } + + rv = listen(sockfd, 5); + if (rv < 0) { + fprintf(stderr, "listen: "); + exit(EXIT_FAILURE); + } + + int accfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len); + if (accfd < 0) { + fprintf(stderr, "accept: "); + exit(EXIT_FAILURE); + } + + + size_t buffer_size = 100; + char buffer[buffer_size]; + memset(&buffer, 0, buffer_size); + + while (1) { + read(accfd, buffer, buffer_size); + write(accfd, buffer, buffer_size); + memset(&buffer, 0, buffer_size); + } } int main(int argc, char *argv[]) { @@ -9,8 +64,8 @@ int main(int argc, char *argv[]) { // listen() // accept // send/recv - - run_server(2137); + handle_arguments(argc, argv); + run_server(strtol(argv[1], NULL, 10)); return 0; } \ No newline at end of file