From 03ae3f4cd9fd8921902448a2930341e65afae05d Mon Sep 17 00:00:00 2001 From: Daniel Meiburg Date: Thu, 16 May 2024 01:13:49 +0200 Subject: [PATCH] 04_intro_to_sockets: working tcp example --- 03_io_access/lib/io.c | 1 + 04_intro_to_sockets/Makefile | 24 ++--- 04_intro_to_sockets/README.md | 2 +- 04_intro_to_sockets/bin/daytimeTCPCli | Bin 0 -> 17272 bytes 04_intro_to_sockets/bin/daytimeTCPSrv | Bin 0 -> 17272 bytes 04_intro_to_sockets/lib/sockets.c | 113 ++++++++++++++++++++++++ 04_intro_to_sockets/lib/sockets.h | 19 +++- 04_intro_to_sockets/obj/sockets.o | Bin 0 -> 4752 bytes 04_intro_to_sockets/src/daytimeTCPCli.c | 21 +++++ 04_intro_to_sockets/src/daytimeTCPSrv.c | 20 +++++ 04_intro_to_sockets/src/main.c | 4 - 11 files changed, 186 insertions(+), 18 deletions(-) create mode 100755 04_intro_to_sockets/bin/daytimeTCPCli create mode 100755 04_intro_to_sockets/bin/daytimeTCPSrv create mode 100644 04_intro_to_sockets/obj/sockets.o create mode 100644 04_intro_to_sockets/src/daytimeTCPCli.c create mode 100644 04_intro_to_sockets/src/daytimeTCPSrv.c delete mode 100644 04_intro_to_sockets/src/main.c diff --git a/03_io_access/lib/io.c b/03_io_access/lib/io.c index 8552713..874e33a 100644 --- a/03_io_access/lib/io.c +++ b/03_io_access/lib/io.c @@ -13,6 +13,7 @@ static struct gpiod_line *button_line = NULL; // Error handling function static int handle_error(const char *msg) { perror(msg); + cleanup_gpio() return -1; } diff --git a/04_intro_to_sockets/Makefile b/04_intro_to_sockets/Makefile index 393b7ba..116698d 100644 --- a/04_intro_to_sockets/Makefile +++ b/04_intro_to_sockets/Makefile @@ -1,10 +1,11 @@ +# Compiler and flags CC = gcc CFLAGS = -Wall -Ilib -#LDFLAGS = -lgpiod # Directories SRCDIR = src LIBDIR = lib +BINDIR = bin OBJDIR = obj # Source files @@ -13,27 +14,26 @@ SRC_SOURCES = $(wildcard $(SRCDIR)/*.c) # Object files LIB_OBJECTS = $(LIB_SOURCES:$(LIBDIR)/%.c=$(OBJDIR)/%.o) -SRC_OBJECTS = $(SRC_SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o) -# Target executable -TARGET = sockets +# Executables +EXECS = $(SRC_SOURCES:$(SRCDIR)/%.c=$(BINDIR)/%) -# Create obj directory if it doesn't exist +# Create necessary directories $(shell mkdir -p $(OBJDIR)) +$(shell mkdir -p $(BINDIR)) # Rules -all: $(TARGET) +all: $(EXECS) -$(TARGET): $(LIB_OBJECTS) $(SRC_OBJECTS) - $(CC) $(LIB_OBJECTS) $(SRC_OBJECTS) -o $@ $(LDFLAGS) +$(BINDIR)/%: $(SRCDIR)/%.c $(LIB_OBJECTS) + $(CC) $(CFLAGS) -o $@ $< $(LIB_OBJECTS) $(OBJDIR)/%.o: $(LIBDIR)/%.c $(CC) $(CFLAGS) -c $< -o $@ -$(OBJDIR)/%.o: $(SRCDIR)/%.c - $(CC) $(CFLAGS) -c $< -o $@ - clean: - rm -f $(OBJDIR)/*.o $(TARGET) + rm -f $(OBJDIR)/*.o + rm -f $(BINDIR)/* .PHONY: all clean + diff --git a/04_intro_to_sockets/README.md b/04_intro_to_sockets/README.md index efc3305..eb91d03 100644 --- a/04_intro_to_sockets/README.md +++ b/04_intro_to_sockets/README.md @@ -7,5 +7,5 @@ a LED, a button and a temperature sensor. ```bash $ make -$ ./io +$ ./sockets ``` diff --git a/04_intro_to_sockets/bin/daytimeTCPCli b/04_intro_to_sockets/bin/daytimeTCPCli new file mode 100755 index 0000000000000000000000000000000000000000..549cb1132c9ce593b07ee147fd992e91a21789a6 GIT binary patch literal 17272 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 F_)kWoufqTU literal 0 HcmV?d00001 diff --git a/04_intro_to_sockets/bin/daytimeTCPSrv b/04_intro_to_sockets/bin/daytimeTCPSrv new file mode 100755 index 0000000000000000000000000000000000000000..6d094af88cfa73a3ffb81977b8eacedf947d9851 GIT binary patch literal 17272 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 literal 0 HcmV?d00001 diff --git a/04_intro_to_sockets/lib/sockets.c b/04_intro_to_sockets/lib/sockets.c index e69de29..7031a77 100644 --- a/04_intro_to_sockets/lib/sockets.c +++ b/04_intro_to_sockets/lib/sockets.c @@ -0,0 +1,113 @@ +#include // For inet_addr(), htons() +#include // For printf() +#include // For exit() +#include // For memset() +#include // For socket(), connect(), read(), write() +#include +#include // For close() +#include "sockets.h" + +#define BUFFER_SIZE 1024 + +static void error_handling(char *message, int sock) { + perror(message); + close(sock); + exit(1); +} + +int tcp_create_socket() { + // PF_INET: IPv4, SOCK_STREAM: TCP + int sock = socket(PF_INET, SOCK_STREAM, 0); + if (sock == -1) + error_handling("socket() error", sock); + return sock; +} + +void connect_to_server(int sock, char *ip, int port) { + struct sockaddr_in serv_addr; + // Initialize serv_addr to zero + memset(&serv_addr, 0, sizeof(serv_addr)); + // Set the address family to IPv4 + serv_addr.sin_family = AF_INET; + // Convert IP address to binary form + serv_addr.sin_addr.s_addr = inet_addr(ip); + // Convert port number to network byte order + serv_addr.sin_port = htons(port); + + if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) + error_handling("connect() error", sock); +} + +char* communicate(int sock, char *message) { + // Sending the ASCII string + if (write(sock, message, strlen(message)) == -1) + error_handling("write() error", sock); + + // Receiving response + char* response = malloc(BUFFER_SIZE); + if (!response) + error_handling("Failed to allocate memory for response", sock); + + int str_len = read(sock, response, BUFFER_SIZE - 1); + if (str_len == -1){ + free(response); + error_handling("read() error", sock); + } else if (str_len == 0) { + printf("Server closed the connection.\n"); + free(response); + return NULL; + } else { + response[str_len] = '\0'; // Null-terminate the received data + } + return response; +} + +int tcp_listen(int port) { + int sock = tcp_create_socket(); + + struct sockaddr_in serv_addr; + memset(&serv_addr, 0, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + serv_addr.sin_port = htons(port); + + if (bind(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) + error_handling("bind() error", sock); + + if (listen(sock, 5) == -1) + error_handling("listen() error", sock); + + return sock; +} + +int tcp_accept(int serv_sock) { + struct sockaddr_in clnt_addr; + socklen_t clnt_addr_size = sizeof(clnt_addr); + int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); + if (clnt_sock == -1) + error_handling("accept() error", clnt_sock); + return clnt_sock; +} + +void process_request(int clnt_sock) { + char message[BUFFER_SIZE]; + int str_len = read(clnt_sock, message, BUFFER_SIZE - 1); + if (str_len == -1) + // TODO: clnt_sock might be a bug + error_handling("read() error", clnt_sock); + + message[str_len] = '\0'; // Null-terminate the string + + time_t t = time(NULL); + struct tm *timeinfo; + + if (strcmp(message, "1") == 0) { + timeinfo = localtime(&t); // Local time + } else { + timeinfo = gmtime(&t); // GMT time + } + + strftime(message, BUFFER_SIZE, "%Y-%m-%d %H:%M:%S", timeinfo); + write(clnt_sock, message, strlen(message)); +} + diff --git a/04_intro_to_sockets/lib/sockets.h b/04_intro_to_sockets/lib/sockets.h index ab5885f..cf6322d 100644 --- a/04_intro_to_sockets/lib/sockets.h +++ b/04_intro_to_sockets/lib/sockets.h @@ -1,5 +1,22 @@ #ifndef SOCKETS_LIB_H #define SOCKETS_LIB_H +// Function to create a TCP socket +int tcp_create_socket(); -#endif // SOCKETS_H +// Function to connect to a server +void connect_to_server(int sock, char *ip, int port); + +// Function to communicate with the server +char* communicate(int sock, char *message); + +// Function to create a TCP server socket +int tcp_listen(int port); + +// Function to accept a client connection +int tcp_accept(int serv_sock); + +// Function to process a client request +void process_request(int clnt_sock); + +#endif // SOCKETS_LIB_H diff --git a/04_intro_to_sockets/obj/sockets.o b/04_intro_to_sockets/obj/sockets.o new file mode 100644 index 0000000000000000000000000000000000000000..a45d678bb6a11acc8f73e949d40399e3e1e31243 GIT binary patch literal 4752 zcmb_eU2IfE6rSCJC_-ELQ53;TVilrYT6s{3Ar)MDAH*0){flI?>`vQ-{i*lf#a3vD z)T%dYl>{Gvs08B!KBzAk2~k>q0-6wo7e!N(jc90WO)BX_gVptXb7$^OFMAUoJjv|L zeCIo7=AJooX7|M(-5iZXn34$Fz^XHaGS=8o9k+>L8>?pvS%>NVW)4g=nr{EJTbwdW z@oCdNI|fE6J|#!P@F*}vKLx^Rz{63cbK^4u{WFzfLn%Jvo*4#X?CnaWLep=)l!k`e zKViDXvfD9c4#g)=H4^DGm}=3^v+>C&qivKG;>M>+@v(+aM&xEX-S`!AXv<_NJ|WCa z_gkqMm==pqsKpIh{J=F!>%L9*3$wJPOs=Y4%%Gbe|EW}l*&G=G)1?Rv^iMN<(9Yo`fbk`C9A@gg@De$H zhL#|T|8XsD|ES=JQ=*fg=$30nw;W~FW!(6$rTFNq*#1JXrGU)Tj;(*NU;Ql(_VirZ z+wAcBlw%&n-(#EGf9`C26i03jb&PuJoYNz9ZT@VZ<>SSP7CHv^v(djO+CxK=)RhJ? z35oe4Ppk5wQ8=4251n~wE^M_xnC{@1a5@OZtc)BSDK0gKJhl8%;zLxl# zlbI|}8&1JUX0wG<(&0vq=L%Mz(OIwzi`zYgyv>=#lWE^<8@G0I%SdGlHcY#@A(zP% z@-em}ldn><8QbA`-!hp>@t*2#T3OT6%}u%HrnJ#yu5a41zG)j{?VC2OH&(Yl*0IKD zy)U*d)*`-(g2D`H$RElg!KR{Uf@5 zpSQk2*hQ(oqU)o7cm%1d)gdl(*q@bJy1E)Kz>P$t82fY)D>xpw9?EVn`2FdTH9wN?#`p2o&TKCBiJQ;#_h2RCkvCm7?L&SMg zkM(P@IMN{-wnY}5Dx!oJnJMPZ>dKf z*NOw)67Y{pzQ|+3#zXkuh2Yrx$VGbD%ZnM$+J!- z$5~fSbcA<`!7UUA$Q){@r8D%O2ZDPF0ghUz@OuD~0G~%q;q3rPfZsq(;m-ghnNJNm zC9lZ=Fw_>sM}9(pFQBII4*`+@Ur0^iUjrloUQbQoKL8|A>o#~(c2)M^BOevNUfu`b zH);4vi7P*MkPgzU@fXot`PmrYw+J?4+co}Tjc;i<-YDf~Z@>@g6y)^)p7vmNQ1i2t zFy-f{hU@+>XgJ<7#s6Ky^>ewZ;m8@qpD*t%;-;U=of^JOVbp7qV01ucEo~)2HEjJ|EO@J)aFYBf)3OPZ#rt#BUW}E9cJ! zaP_Y44d9pL{H*}4-kDDWxOyK(1GstzSj_IrImsQ=JC@gXtC7XC$(X}?9TrO`og|Cx zux%Ez3f=@ImFG#9FE~6#{|%dMCz;wM=Uw??jEW=`bEl7N;E8u9I;|wt#{WYMa)PUZ znyE{hoE(woqIB|FsVPG)Bj?(DL=KQ}B$Lt}cN4a_yAa$l$X(Qc2bN(!1p$yrg6re| z7JLTj|JA-#`qXoaAXb(RKgUE9wSNWS{~h+E>ZZbvAt)rcySk|Tt9~OX)mZ19koG!; zage)}FuZHQ{hyTf!F>hyzf<}Q+K);5Y0~Qwv_}?#+NP6eJc;5;a@_00n~8T;*{k!% z_XO95Ng0njNsBxOysdzO_V5`zdxBUa6eN>g=l=%dhgwt1{tzB#636TO-=O`!3V*-$ literal 0 HcmV?d00001 diff --git a/04_intro_to_sockets/src/daytimeTCPCli.c b/04_intro_to_sockets/src/daytimeTCPCli.c new file mode 100644 index 0000000..93badde --- /dev/null +++ b/04_intro_to_sockets/src/daytimeTCPCli.c @@ -0,0 +1,21 @@ +#include // For printf() +#include // For close() +#include // For exit(), atoi() +#include "sockets.h" + +int main(int argc, char *argv[]) { + if (argc != 4) { + printf("Usage : %s \n", argv[0]); + exit(1); + } + + int sock = tcp_create_socket(); + connect_to_server(sock, argv[1], atoi(argv[2])); + char* received_data = communicate(sock, argv[3]); + if (received_data) { + printf("Received from server: %s\n", received_data); + free(received_data); + } + close(sock); + return 0; +} diff --git a/04_intro_to_sockets/src/daytimeTCPSrv.c b/04_intro_to_sockets/src/daytimeTCPSrv.c new file mode 100644 index 0000000..634f84a --- /dev/null +++ b/04_intro_to_sockets/src/daytimeTCPSrv.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include "sockets.h" + +int main(int argc, char *argv[]) { + if (argc != 2) { + printf("Usage: %s \n", argv[0]); + exit(1); + } + + int port = atoi(argv[1]); + int serv_sock = tcp_listen(port); + int clnt_sock = tcp_accept(serv_sock); + + process_request(clnt_sock); + close(clnt_sock); + close(serv_sock); + return 0; +} diff --git a/04_intro_to_sockets/src/main.c b/04_intro_to_sockets/src/main.c deleted file mode 100644 index 2b8c6ac..0000000 --- a/04_intro_to_sockets/src/main.c +++ /dev/null @@ -1,4 +0,0 @@ - -int main() { - return 0; -}