From 39c157b2718f24b96dad55c6051ac2aaad72229b Mon Sep 17 00:00:00 2001 From: Arthur-Coppey Date: Sat, 30 Oct 2021 08:08:32 +0200 Subject: [PATCH 1/8] start of refactoring + ipv6 --- server/server.c | 68 +++++++++++++++++++++++++++++++++++-------------- server/server.h | 2 ++ 2 files changed, 51 insertions(+), 19 deletions(-) diff --git a/server/server.c b/server/server.c index b08e979..c8f2c7e 100644 --- a/server/server.c +++ b/server/server.c @@ -10,23 +10,60 @@ extern int errno; unsigned long addressLength = sizeof(struct sockaddr_in); +long recvLen; +int sock, serverSocket, clientSocket, socketType, socketProtocol; +struct sockaddr_in serverAddress, clientAddress; +struct sockaddr_in serverAddress4, clientAddress4; +struct sockaddr_in6 serverAddress6, clientAddress6; +char quote[MESSAGE_STRING_LENGTH] = ""; +char clientMessage[MESSAGE_STRING_LENGTH] = ""; +void server(int tcp, int ipv6) { + // TODO: things common between tcp/udp here + // init sock info + memset(&serverAddress, 0, addressLength); + memset(&clientAddress, 0, addressLength); + + if (ipv6) { + serverAddress6.sin6_family = AF_INET6; + serverAddress6.sin6_addr = in6addr_any; + serverAddress6.sin6_port = htons(17); + } else { + serverAddress.sin_family = AF_INET; + serverAddress.sin_addr.s_addr = INADDR_ANY; + serverAddress.sin_port = htons(17); + } + + // create sock + if (tcp) { + socketType = SOCK_STREAM; + socketProtocol = IPPROTO_TCP; + } else { + socketType = SOCK_DGRAM; + socketProtocol = IPPROTO_UDP; + } + + serverSocket = socket(serverAddress.sin_family, socketType, socketProtocol); + if (serverSocket == -1) { + puts("socket not created"); + exit(1); + } + puts("socket created"); + + // bind sock +} void tcpServer() { - int serverSocket, clientSocket; - long recvLen; -// unsigned long addressLength = sizeof(struct sockaddr_in); - struct sockaddr_in serverAddress, clientAddress; - char quote[MESSAGE_STRING_LENGTH] = ""; - char clientMessage[MESSAGE_STRING_LENGTH] = ""; - /*initialize socket info*/ + memset(&serverAddress, 0, addressLength); + memset(&clientAddress, 0, addressLength); + serverAddress.sin_family = AF_INET; serverAddress.sin_addr.s_addr = INADDR_ANY; serverAddress.sin_port = htons(17); /*create socket*/ - serverSocket = socket(serverAddress.sin_family, SOCK_STREAM, IPPROTO_IP); + serverSocket = socket(serverAddress.sin_family, SOCK_STREAM, IPPROTO_TCP); if (serverSocket == -1) { puts("socket not created"); exit(1); @@ -74,12 +111,6 @@ void tcpServer() { } _Noreturn void udpServer() { - int sock; -// unsigned long addressLength = sizeof(struct sockaddr_in); - struct sockaddr_in serverAddress, clientAddress; - char quote[MESSAGE_STRING_LENGTH] = ""; - char clientMessage[MESSAGE_STRING_LENGTH] = ""; - /*initialize sock info*/ memset(&serverAddress, 0, addressLength); memset(&clientAddress, 0, addressLength); @@ -97,23 +128,22 @@ _Noreturn void udpServer() { puts("sock created"); /*bind sock to address:port*/ - if (bind(sock, (const struct sockaddr *) &serverAddress, sizeof serverAddress) < 0) { + if (bind(sock, (const struct sockaddr *) &serverAddress, addressLength) < 0) { puts("bind failed"); exit(2); } puts("address bound"); - /*accept connections*/ //TODO: t h r e a d s ? - while (1) { + for (;;) { /*receive data*/ - int recvLen = recvfrom(sock, clientMessage, MESSAGE_STRING_LENGTH, 0, + recvLen = recvfrom(sock, clientMessage, MESSAGE_STRING_LENGTH, 0, (struct sockaddr *) &clientAddress, (socklen_t *) &addressLength); uint16_t port = ntohs(clientAddress.sin_port); char *ipv4 = inet_ntoa(clientAddress.sin_addr); - printf("recvLen = %d from = %s:%d\nmsg = `%s`\n", recvLen, ipv4, port, clientMessage); + printf("recvLen = %ld from = %s:%d\nmsg = `%s`\n", recvLen, ipv4, port, clientMessage); perror("recvfrom"); if (recvLen >= 0) { diff --git a/server/server.h b/server/server.h index d42e0c6..ec51a25 100644 --- a/server/server.h +++ b/server/server.h @@ -19,6 +19,8 @@ #define MESSAGE_STRING_LENGTH 2048 +void server(int tcp, int ipv6); + void tcpServer(); _Noreturn void udpServer(); From a0a1cafa8aacff318927135a79c089901e7f074d Mon Sep 17 00:00:00 2001 From: Arthur-Coppey Date: Tue, 9 Nov 2021 14:11:00 +0100 Subject: [PATCH 2/8] sockaddr from sockaddr_in(6) --- server/server.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/server/server.c b/server/server.c index c8f2c7e..b10377f 100644 --- a/server/server.c +++ b/server/server.c @@ -12,6 +12,7 @@ extern int errno; unsigned long addressLength = sizeof(struct sockaddr_in); long recvLen; int sock, serverSocket, clientSocket, socketType, socketProtocol; +struct sockaddr * srvAddr; struct sockaddr_in serverAddress, clientAddress; struct sockaddr_in serverAddress4, clientAddress4; struct sockaddr_in6 serverAddress6, clientAddress6; @@ -28,10 +29,12 @@ void server(int tcp, int ipv6) { serverAddress6.sin6_family = AF_INET6; serverAddress6.sin6_addr = in6addr_any; serverAddress6.sin6_port = htons(17); + srvAddr = (struct sockaddr *) &serverAddress6; } else { - serverAddress.sin_family = AF_INET; - serverAddress.sin_addr.s_addr = INADDR_ANY; - serverAddress.sin_port = htons(17); + serverAddress4.sin_family = AF_INET; + serverAddress4.sin_addr.s_addr = INADDR_ANY; + serverAddress4.sin_port = htons(17); + srvAddr = (struct sockaddr *) &serverAddress4; } // create sock @@ -43,7 +46,7 @@ void server(int tcp, int ipv6) { socketProtocol = IPPROTO_UDP; } - serverSocket = socket(serverAddress.sin_family, socketType, socketProtocol); + serverSocket = socket(srvAddr->sa_family, socketType, socketProtocol); if (serverSocket == -1) { puts("socket not created"); exit(1); @@ -51,6 +54,13 @@ void server(int tcp, int ipv6) { puts("socket created"); // bind sock + if (bind(serverSocket, srvAddr, addressLength) < 0) { + puts("bind failed"); + exit(2); + } + + // TODO: udp/tcp + } void tcpServer() { From 3db7ea49b0ccabc2a2859a00571e98bcd4e25694 Mon Sep 17 00:00:00 2001 From: Arthur-Coppey Date: Fri, 12 Nov 2021 16:57:17 +0100 Subject: [PATCH 3/8] refactor done (mostly, at least), ipv6 works btw --- server/main.c | 6 +- server/server.c | 198 ++++++++++++++++++------------------------------ 2 files changed, 77 insertions(+), 127 deletions(-) diff --git a/server/main.c b/server/main.c index 846bbf1..4fcf290 100644 --- a/server/main.c +++ b/server/main.c @@ -1,10 +1,8 @@ #include "server.h" int main(int argc, char *argv[]) { -// char quote[1024]; -// getRandomQuote(quote); -// printf("%s\n", quote); - tcpServer(); + // TODO: shell args + server(1, 1); return 0; } diff --git a/server/server.c b/server/server.c index b10377f..e715820 100644 --- a/server/server.c +++ b/server/server.c @@ -4,111 +4,52 @@ #include "server.h" -//TODO: refactor //TODO: object-like C extern int errno; -unsigned long addressLength = sizeof(struct sockaddr_in); -long recvLen; -int sock, serverSocket, clientSocket, socketType, socketProtocol; -struct sockaddr * srvAddr; -struct sockaddr_in serverAddress, clientAddress; -struct sockaddr_in serverAddress4, clientAddress4; -struct sockaddr_in6 serverAddress6, clientAddress6; -char quote[MESSAGE_STRING_LENGTH] = ""; -char clientMessage[MESSAGE_STRING_LENGTH] = ""; +_Noreturn void udpListen(int serverSocket, struct sockaddr * clientAddress, unsigned long addressLength) { + int recvLen; + char clientMessage[MESSAGE_STRING_LENGTH], quote[MESSAGE_STRING_LENGTH]; -void server(int tcp, int ipv6) { - // TODO: things common between tcp/udp here - // init sock info - memset(&serverAddress, 0, addressLength); - memset(&clientAddress, 0, addressLength); + for (;;) { + // receive data + recvLen = recvfrom(serverSocket, clientMessage, MESSAGE_STRING_LENGTH, 0, clientAddress, (socklen_t *) &addressLength); - if (ipv6) { - serverAddress6.sin6_family = AF_INET6; - serverAddress6.sin6_addr = in6addr_any; - serverAddress6.sin6_port = htons(17); - srvAddr = (struct sockaddr *) &serverAddress6; - } else { - serverAddress4.sin_family = AF_INET; - serverAddress4.sin_addr.s_addr = INADDR_ANY; - serverAddress4.sin_port = htons(17); - srvAddr = (struct sockaddr *) &serverAddress4; + perror("recvfrom"); + if (recvLen >= 0) { + printf("client says: %s\n", clientMessage); + + // send data + getRandomQuote(quote); + printf("responding: `%s`\n", quote); + sendto(serverSocket, quote, strlen(quote), 0, clientAddress, addressLength); + perror("sendto"); + } } - - // create sock - if (tcp) { - socketType = SOCK_STREAM; - socketProtocol = IPPROTO_TCP; - } else { - socketType = SOCK_DGRAM; - socketProtocol = IPPROTO_UDP; - } - - serverSocket = socket(srvAddr->sa_family, socketType, socketProtocol); - if (serverSocket == -1) { - puts("socket not created"); - exit(1); - } - puts("socket created"); - - // bind sock - if (bind(serverSocket, srvAddr, addressLength) < 0) { - puts("bind failed"); - exit(2); - } - - // TODO: udp/tcp - } -void tcpServer() { - /*initialize socket info*/ - memset(&serverAddress, 0, addressLength); - memset(&clientAddress, 0, addressLength); +void tcpListen(int serverSocket, struct sockaddr * clientAddress, unsigned long addressLength) { + int clientSocket; + char quote[MESSAGE_STRING_LENGTH] = "", clientMessage[MESSAGE_STRING_LENGTH] = ""; - serverAddress.sin_family = AF_INET; - serverAddress.sin_addr.s_addr = INADDR_ANY; - serverAddress.sin_port = htons(17); - - /*create socket*/ - serverSocket = socket(serverAddress.sin_family, SOCK_STREAM, IPPROTO_TCP); - if (serverSocket == -1) { - puts("socket not created"); - exit(1); - } - puts("socket created"); - - /*bind socket to address:port*/ - if (bind(serverSocket, (const struct sockaddr *) &serverAddress, addressLength) < 0) { - puts("bind failed"); - exit(2); - } - puts("address bound"); - - /*start listening*/ listen(serverSocket, 5); puts("server listening"); - /*accept connections*/ + // accept connections //TODO: t h r e a d s - while ((clientSocket = accept(serverSocket, (struct sockaddr *) &clientAddress, (socklen_t *) &addressLength)) >= + while ((clientSocket = accept(serverSocket, clientAddress, (socklen_t *) &addressLength)) >= 0) { puts("client connected"); - /*receive data*/ - while ((recvLen = recv(clientSocket, clientMessage, MESSAGE_STRING_LENGTH, 0))) { - if (recvLen < 0) { - puts("receive failed"); - } else { - printf("client says: %s\n", clientMessage); + // receive data + while (recv(clientSocket, clientMessage, MESSAGE_STRING_LENGTH, 0) >= 0) { + printf("client says: %s\n", clientMessage); - /*send data*/ - getRandomQuote(quote); - printf("responding: \"%s\"\n", quote); - send(clientSocket, quote, strlen(quote), 0); - } + // send data + getRandomQuote(quote); + printf("responding: \"%s\"\n", quote); + send(clientSocket, quote, strlen(quote), 0); } puts("client disconnected"); @@ -120,50 +61,61 @@ void tcpServer() { } } -_Noreturn void udpServer() { - /*initialize sock info*/ - memset(&serverAddress, 0, addressLength); - memset(&clientAddress, 0, addressLength); +void server(int tcp, int ipv6) { + int serverSocket, socketType, socketProtocol; + unsigned long serverAddressLength, clientAddressLength; + struct sockaddr *serverAddress, *clientAddress; + struct sockaddr_in serverAddress4, clientAddress4; + struct sockaddr_in6 serverAddress6, clientAddress6; - serverAddress.sin_family = AF_INET; - serverAddress.sin_addr.s_addr = INADDR_ANY; - serverAddress.sin_port = htons(17); + if (ipv6) { + serverAddress6.sin6_family = AF_INET6; + serverAddress6.sin6_addr = in6addr_any; + serverAddress6.sin6_port = htons(17); + serverAddress = (struct sockaddr *) &serverAddress6; + serverAddressLength = sizeof serverAddress6; - /*create sock*/ - sock = socket(serverAddress.sin_family, SOCK_DGRAM, IPPROTO_UDP); - if (sock == -1) { - puts("sock not created"); + clientAddress6.sin6_family = AF_INET6; + clientAddress = (struct sockaddr *) &clientAddress6; + clientAddressLength = sizeof clientAddress6; + } else { + serverAddress4.sin_family = AF_INET; + serverAddress4.sin_addr.s_addr = INADDR_ANY; + serverAddress4.sin_port = htons(17); + serverAddress = (struct sockaddr *) &serverAddress4; + serverAddressLength = sizeof serverAddress4; + + clientAddress4.sin_family = AF_INET; + clientAddress = (struct sockaddr *) &clientAddress4; + clientAddressLength = sizeof clientAddress4; + } + + if (tcp) { + socketType = SOCK_STREAM; + socketProtocol = IPPROTO_TCP; + } else { + socketType = SOCK_DGRAM; + socketProtocol = IPPROTO_UDP; + } + + // create sock + serverSocket = socket(serverAddress->sa_family, socketType, socketProtocol); + if (serverSocket == -1) { + puts("socket not created"); exit(1); } - puts("sock created"); + puts("socket created"); - /*bind sock to address:port*/ - if (bind(sock, (const struct sockaddr *) &serverAddress, addressLength) < 0) { + // bind sock + if (bind(serverSocket, serverAddress, serverAddressLength) < 0) { puts("bind failed"); exit(2); } - puts("address bound"); - //TODO: t h r e a d s ? - for (;;) { - /*receive data*/ - recvLen = recvfrom(sock, clientMessage, MESSAGE_STRING_LENGTH, 0, - (struct sockaddr *) &clientAddress, (socklen_t *) &addressLength); - - uint16_t port = ntohs(clientAddress.sin_port); - char *ipv4 = inet_ntoa(clientAddress.sin_addr); - - printf("recvLen = %ld from = %s:%d\nmsg = `%s`\n", recvLen, ipv4, port, clientMessage); - - perror("recvfrom"); - if (recvLen >= 0) { - printf("client says: %s\n", clientMessage); - - /*send data*/ - getRandomQuote(quote); - printf("responding: `%s`\n", quote); - sendto(sock, strcat(quote, "\n"), sizeof quote, 0, (struct sockaddr *) &clientAddress, addressLength); - perror("sendto"); - } + // TODO: threads to run both at the same time + if (tcp) { + tcpListen(serverSocket, clientAddress, clientAddressLength); + } else { + udpListen(serverSocket, clientAddress, clientAddressLength); } } From c63415c134b67d33b26ee2372ecec58fea91b54a Mon Sep 17 00:00:00 2001 From: Arthur-Coppey Date: Fri, 12 Nov 2021 17:04:05 +0100 Subject: [PATCH 4/8] corrections --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 84771bd..a59a300 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,16 @@ A [RFC 865](https://datatracker.ietf.org/doc/html/rfc865) compliant Quote of the * get random quote within file * tcp server * tcp client - -## Todo * udp server * udp client -* t h r e a d s to accept several clients and/or run both udp and tcp servers from same executable +* IPv6 compat + +## Todo +* t h r e a d s to accept several clients and/or run both udp and tcp servers from same executable and instance * macros (#define XXX yyy) for currently hard-coded values +* switches (-x) and options (--xxxx) ? * logging ? * conf files ? -* switches (-x) and options (--xxxx) ? ## Installation @@ -26,7 +27,7 @@ make ``` ## Use -A "quotes.txt" file in the same folder as the server containing one quote per line. Quotes are separated by the line feed ('\n') caracter. +A "quotes.txt" file in the same folder as the server containing one quote per line. Quotes are separated by the line feed `\n` character. Server as root (because port 17) ```sh From fb4052dcffc3cf31e69e1ae0b01eb7754fcbf26a Mon Sep 17 00:00:00 2001 From: Arthur-Coppey Date: Fri, 26 Nov 2021 13:35:43 +0100 Subject: [PATCH 5/8] removed client code and executable, use ncat or similar program to communicate with the server --- CMakeLists.txt | 3 +- client/client.c | 90 ------------------------------------- client/client.h | 20 --------- client/main.c | 12 ----- server/main.c => main.c | 0 server/quote.c => quote.c | 0 server/quote.h => quote.h | 0 server/server.c => server.c | 0 server/server.h => server.h | 0 9 files changed, 1 insertion(+), 124 deletions(-) delete mode 100644 client/client.c delete mode 100644 client/client.h delete mode 100644 client/main.c rename server/main.c => main.c (100%) rename server/quote.c => quote.c (100%) rename server/quote.h => quote.h (100%) rename server/server.c => server.c (100%) rename server/server.h => server.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index c855f88..32c9999 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,5 +3,4 @@ project(qotd C) set(CMAKE_C_STANDARD 99) -add_executable(server server/main.c server/quote.c server/quote.h server/server.c server/server.h) -add_executable(client client/main.c client/client.c client/client.h) \ No newline at end of file +add_executable(qotd main.c quote.c quote.h server.c server.h) \ No newline at end of file diff --git a/client/client.c b/client/client.c deleted file mode 100644 index 0eabfe6..0000000 --- a/client/client.c +++ /dev/null @@ -1,90 +0,0 @@ -// -// Created by k0rb4k on 11/10/2021. -// - -#include "client.h" - -extern int errno; - -int tcp() { - struct sockaddr_in server; - int sock; - - int proto = IPPROTO_IP; - enum __socket_type socketType = SOCK_STREAM; - - server.sin_family = AF_INET; - server.sin_addr.s_addr = inet_addr("127.0.0.1"); - server.sin_port = htons(17); - - sock = socket(server.sin_family, socketType, proto); - if (sock == -1) { - puts("socket not created"); - return 1; - } - puts("socket created"); - - if (connect(sock, (const struct sockaddr *) &server, sizeof(server)) < 0) { - puts("connection failed"); - return 2; - } - puts("connected to server"); - - char *payload = "I dream of sushi"; - if (send(sock, payload, strlen(payload), 0) < 0) { - puts("error while sending payload"); - return 3; - } - puts("payload sent"); - - char response[2048]; - if (recv(sock, response, 2048, 0) < 0) { - puts("receive failed"); - return 4; - } - printf("server response : %s\n", response); - - close(sock); - - return 0; -} - -int udp() { - struct sockaddr_in server; - int sock; - unsigned long addressLength = sizeof server; - - int proto = IPPROTO_UDP; - enum __socket_type socketType = SOCK_DGRAM; - - server.sin_family = AF_INET; - server.sin_addr.s_addr = inet_addr("127.0.0.1"); - server.sin_port = htons(17); - - sock = socket(server.sin_family, socketType, proto); - if (sock == -1) { - puts("socket not created"); - return 1; - } - puts("socket created"); - - char *payload = "I dream of sushi"; - if (sendto(sock, payload, strlen(payload), 0, (const struct sockaddr *) &server, addressLength) < 0) { - puts("error while sending payload"); - perror("sendto"); - return 3; - } - puts("payload sent"); - - char response[2048]; - if (recvfrom(sock, response, 2048, 0, (struct sockaddr *) &server, (socklen_t *) &addressLength) < 0) { - puts("receive failed"); - perror("recvfrom"); - return 4; - } - printf("server response : %s\n", response); - - close(sock); - - return 0; -} \ No newline at end of file diff --git a/client/client.h b/client/client.h deleted file mode 100644 index 17bb0cd..0000000 --- a/client/client.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// Created by k0rb4k on 11/10/2021. -// - -#ifndef QOTD_CLIENT_H -#define QOTD_CLIENT_H - -#include -#include -#include -#include -#include -#include -#include - -int tcp(); - -int udp(); - -#endif //QOTD_CLIENT_H diff --git a/client/main.c b/client/main.c deleted file mode 100644 index 0b9604f..0000000 --- a/client/main.c +++ /dev/null @@ -1,12 +0,0 @@ -// -// Created by k0rb4k on 22/04/2021. -// - -#include "client.h" - -int main(int argc, char *argv[]) { - // TODO: arg options for tcp or udp - tcp(); - - return 0; -} \ No newline at end of file diff --git a/server/main.c b/main.c similarity index 100% rename from server/main.c rename to main.c diff --git a/server/quote.c b/quote.c similarity index 100% rename from server/quote.c rename to quote.c diff --git a/server/quote.h b/quote.h similarity index 100% rename from server/quote.h rename to quote.h diff --git a/server/server.c b/server.c similarity index 100% rename from server/server.c rename to server.c diff --git a/server/server.h b/server.h similarity index 100% rename from server/server.h rename to server.h From 79830a97454c1a89be3dbcfd02250397f83543fd Mon Sep 17 00:00:00 2001 From: Arthur-Coppey Date: Fri, 26 Nov 2021 13:40:21 +0100 Subject: [PATCH 6/8] fix function prototypes in server.h --- server.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server.h b/server.h index ec51a25..2d133e7 100644 --- a/server.h +++ b/server.h @@ -6,7 +6,7 @@ #define QOTD_SERVER_H #include -//#include +#include #include #include #include @@ -21,8 +21,8 @@ void server(int tcp, int ipv6); -void tcpServer(); +void tcpListen(int serverSocket, struct sockaddr *clientAddress, unsigned long addressLength); -_Noreturn void udpServer(); +_Noreturn void udpListen(int serverSocket, struct sockaddr *clientAddress, unsigned long addressLength); #endif //QOTD_SERVER_H From b869bbbc271c07888f251215bd780d043fdb9606 Mon Sep 17 00:00:00 2001 From: Arthur-Coppey Date: Fri, 26 Nov 2021 13:56:48 +0100 Subject: [PATCH 7/8] config.h config file to centralize default values --- CMakeLists.txt | 2 +- config.h | 12 ++++++++++++ quote.c | 1 + quote.h | 2 -- server.c | 5 +++-- server.h | 2 -- 6 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 config.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 32c9999..5bb56d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,4 +3,4 @@ project(qotd C) set(CMAKE_C_STANDARD 99) -add_executable(qotd main.c quote.c quote.h server.c server.h) \ No newline at end of file +add_executable(qotd main.c quote.c quote.h server.c server.h config.h) \ No newline at end of file diff --git a/config.h b/config.h new file mode 100644 index 0000000..9083199 --- /dev/null +++ b/config.h @@ -0,0 +1,12 @@ +// +// Created by k0rb4k on 26/11/2021. +// + +#ifndef QOTD_CONFIG_H +#define QOTD_CONFIG_H + +#define QUOTES_FILE "./quotes.txt" +#define MESSAGE_STRING_LENGTH 2048 +#define DEFAULT_LISTEN_PORT 17 // should be 17 to be RFC compliant + +#endif //QOTD_CONFIG_H diff --git a/quote.c b/quote.c index 5c746b4..9645269 100644 --- a/quote.c +++ b/quote.c @@ -3,6 +3,7 @@ // #include "quote.h" +#include "config.h" void getRandomQuote(char quote[2048]) { int lineCount; diff --git a/quote.h b/quote.h index fba8603..b7deeda 100644 --- a/quote.h +++ b/quote.h @@ -11,8 +11,6 @@ #include #include -#define QUOTES_FILE "./quotes.txt" - void getRandomQuote(char quote[2048]); void getQuote(long line, char quote[2048]); diff --git a/server.c b/server.c index e715820..d753a20 100644 --- a/server.c +++ b/server.c @@ -3,6 +3,7 @@ // #include "server.h" +#include "config.h" //TODO: object-like C @@ -71,7 +72,7 @@ void server(int tcp, int ipv6) { if (ipv6) { serverAddress6.sin6_family = AF_INET6; serverAddress6.sin6_addr = in6addr_any; - serverAddress6.sin6_port = htons(17); + serverAddress6.sin6_port = htons(DEFAULT_LISTEN_PORT); serverAddress = (struct sockaddr *) &serverAddress6; serverAddressLength = sizeof serverAddress6; @@ -81,7 +82,7 @@ void server(int tcp, int ipv6) { } else { serverAddress4.sin_family = AF_INET; serverAddress4.sin_addr.s_addr = INADDR_ANY; - serverAddress4.sin_port = htons(17); + serverAddress4.sin_port = htons(DEFAULT_LISTEN_PORT); serverAddress = (struct sockaddr *) &serverAddress4; serverAddressLength = sizeof serverAddress4; diff --git a/server.h b/server.h index 2d133e7..5f4a381 100644 --- a/server.h +++ b/server.h @@ -17,8 +17,6 @@ #include "quote.h" -#define MESSAGE_STRING_LENGTH 2048 - void server(int tcp, int ipv6); void tcpListen(int serverSocket, struct sockaddr *clientAddress, unsigned long addressLength); From 545969377758b58d5e14e9b2fcffe630e66f9559 Mon Sep 17 00:00:00 2001 From: Arthur-Coppey Date: Fri, 26 Nov 2021 14:08:49 +0100 Subject: [PATCH 8/8] more refactor, print error message *if* there is one, and RFC compliance (terminating connection after sending quote) --- server.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/server.c b/server.c index d753a20..9b54806 100644 --- a/server.c +++ b/server.c @@ -10,22 +10,22 @@ extern int errno; _Noreturn void udpListen(int serverSocket, struct sockaddr * clientAddress, unsigned long addressLength) { - int recvLen; char clientMessage[MESSAGE_STRING_LENGTH], quote[MESSAGE_STRING_LENGTH]; for (;;) { // receive data - recvLen = recvfrom(serverSocket, clientMessage, MESSAGE_STRING_LENGTH, 0, clientAddress, (socklen_t *) &addressLength); - perror("recvfrom"); - if (recvLen >= 0) { - printf("client says: %s\n", clientMessage); + if (recvfrom(serverSocket, clientMessage, MESSAGE_STRING_LENGTH, 0, clientAddress, (socklen_t *) &addressLength) >= 0) { + printf("received: %s\n", clientMessage); // send data getRandomQuote(quote); - printf("responding: `%s`\n", quote); - sendto(serverSocket, quote, strlen(quote), 0, clientAddress, addressLength); - perror("sendto"); + printf("sending: %s\n", quote); + if (sendto(serverSocket, quote, strlen(quote), 0, clientAddress, addressLength) == -1) { + perror("udp: sendto"); + } + } else { + perror("udp: recvfrom"); } } } @@ -39,21 +39,26 @@ void tcpListen(int serverSocket, struct sockaddr * clientAddress, unsigned long // accept connections //TODO: t h r e a d s - while ((clientSocket = accept(serverSocket, clientAddress, (socklen_t *) &addressLength)) >= - 0) { + while ((clientSocket = accept(serverSocket, clientAddress, (socklen_t *) &addressLength)) >= 0) { puts("client connected"); // receive data - while (recv(clientSocket, clientMessage, MESSAGE_STRING_LENGTH, 0) >= 0) { + if (recv(clientSocket, clientMessage, MESSAGE_STRING_LENGTH, 0) >= 0) { printf("client says: %s\n", clientMessage); // send data getRandomQuote(quote); printf("responding: \"%s\"\n", quote); - send(clientSocket, quote, strlen(quote), 0); + if (send(clientSocket, quote, strlen(quote), 0) == -1) { + perror("tcp: send"); + } + } else { + perror("tcp: recv"); } - puts("client disconnected"); + close(clientSocket); + + puts("closed connection"); } if (clientSocket < 0) {