From 7ad0e7ad567d53110426d78ad38a0c6481bdc951 Mon Sep 17 00:00:00 2001 From: Arthur-Coppey Date: Fri, 15 Oct 2021 14:08:44 +0200 Subject: [PATCH] working udp --- CMakeLists.txt | 2 +- client/client.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++ client/client.h | 19 +++++++++++ client/main.c | 45 ++------------------------ server/main.c | 2 +- server/server.c | 77 ++++++++++++++++++++++++++++++++++++++------ server/server.h | 5 ++- 7 files changed, 181 insertions(+), 54 deletions(-) create mode 100644 client/client.c create mode 100644 client/client.h diff --git a/CMakeLists.txt b/CMakeLists.txt index adb5a39..c855f88 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,4 +4,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) \ No newline at end of file +add_executable(client client/main.c client/client.c client/client.h) \ No newline at end of file diff --git a/client/client.c b/client/client.c new file mode 100644 index 0000000..a7688ea --- /dev/null +++ b/client/client.c @@ -0,0 +1,85 @@ +// +// Created by k0rb4k on 11/10/2021. +// + +#include "client.h" + +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; + + 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, sizeof server) < 0) { + puts("error while sending payload"); + return 3; + } + puts("payload sent"); + + char response[2048]; + if (recvfrom(sock, response, 2048, 0, (struct sockaddr *) &server, (socklen_t *) sizeof server) < 0) { + puts("receive failed"); + 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 new file mode 100644 index 0000000..1be53eb --- /dev/null +++ b/client/client.h @@ -0,0 +1,19 @@ +// +// Created by k0rb4k on 11/10/2021. +// + +#ifndef QOTD_CLIENT_H +#define QOTD_CLIENT_H + +#include +#include +#include +#include +#include +#include + +int tcp(); + +int udp(); + +#endif //QOTD_CLIENT_H diff --git a/client/main.c b/client/main.c index 4183b0c..8d36ba9 100644 --- a/client/main.c +++ b/client/main.c @@ -2,50 +2,11 @@ // Created by k0rb4k on 22/04/2021. // -#include -#include -#include -#include -#include -#include -#include +#include "client.h" int main(int argc, char *argv[]) { - struct sockaddr_in server; - int sock; - - 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, SOCK_STREAM, IPPROTO_IP); - 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); + // TODO: arg options for tcp or udp + udp(); return 0; } \ No newline at end of file diff --git a/server/main.c b/server/main.c index 846bbf1..91cd315 100644 --- a/server/main.c +++ b/server/main.c @@ -4,7 +4,7 @@ int main(int argc, char *argv[]) { // char quote[1024]; // getRandomQuote(quote); // printf("%s\n", quote); - tcpServer(); + udpServer(); return 0; } diff --git a/server/server.c b/server/server.c index b878cac..4876f72 100644 --- a/server/server.c +++ b/server/server.c @@ -4,10 +4,18 @@ #include "server.h" +//TODO: refactor +//TODO: object-like C + +extern int errno; + +unsigned long addressLength = sizeof(struct sockaddr_in); + + void tcpServer() { int serverSocket, clientSocket; - long read_size; - unsigned long addressLength; + long recvLen; +// unsigned long addressLength = sizeof(struct sockaddr_in); struct sockaddr_in serverAddress, clientAddress; char quote[MESSAGE_STRING_LENGTH] = ""; char clientMessage[MESSAGE_STRING_LENGTH] = ""; @@ -38,13 +46,13 @@ void tcpServer() { /*accept connections*/ //TODO: t h r e a d s - addressLength = sizeof(struct sockaddr_in); - while ((clientSocket = accept(serverSocket, (struct sockaddr *) &clientAddress, (socklen_t *) &addressLength)) >= 0) { + while ((clientSocket = accept(serverSocket, (struct sockaddr *) &clientAddress, (socklen_t *) &addressLength)) >= + 0) { puts("client connected"); /*receive data*/ - while ((read_size = recv(clientSocket, clientMessage, MESSAGE_STRING_LENGTH, 0))) { - if (read_size < 0) { + while ((recvLen = recv(clientSocket, clientMessage, MESSAGE_STRING_LENGTH, 0))) { + if (recvLen < 0) { puts("receive failed"); } else { printf("client says: %s\n", clientMessage); @@ -52,7 +60,7 @@ void tcpServer() { /*send data*/ getRandomQuote(quote); printf("responding: \"%s\"\n", quote); - write(clientSocket, quote, strlen(quote)); + send(clientSocket, quote, strlen(quote), 0); } } @@ -65,6 +73,57 @@ void tcpServer() { } } -void udpServer() { - //TODO: udp handling +_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); + + serverAddress.sin_family = AF_INET; + serverAddress.sin_addr.s_addr = INADDR_ANY; + serverAddress.sin_port = htons(17); + + /*create sock*/ + sock = socket(serverAddress.sin_family, SOCK_DGRAM, IPPROTO_UDP); + if (sock == -1) { + puts("sock not created"); + exit(1); + } + puts("sock created"); + + /*bind sock to address:port*/ + if (bind(sock, (const struct sockaddr *) &serverAddress, sizeof serverAddress) < 0) { + puts("bind failed"); + exit(2); + } + puts("address bound"); + + /*accept connections*/ + //TODO: t h r e a d s ? + while (1) { + /*receive data*/ + int 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); + + 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"); + } + } } diff --git a/server/server.h b/server/server.h index 1a15a31..d42e0c6 100644 --- a/server/server.h +++ b/server/server.h @@ -6,11 +6,14 @@ #define QOTD_SERVER_H #include +//#include #include +#include #include #include #include #include +#include #include "quote.h" @@ -18,6 +21,6 @@ void tcpServer(); -void udpServer(); +_Noreturn void udpServer(); #endif //QOTD_SERVER_H