From 570aa73f56b2dcc96fe008b32370b2c331eb1b5f Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Fri, 24 Nov 2023 21:04:54 -0300 Subject: [PATCH 1/8] configuring cmake --- .gitignore | 13 +++++++++++ CMakeLists.txt | 4 ++++ ...iente e Servidor via Conexão por Socket.png | Bin 33933 -> 0 bytes graphic.py => data/graphic.py | 0 requirements.txt => data/requirements.txt | 0 data/time_file1 | 3 +++ makefile | 22 ------------------ client.c => src/client.c | 4 ++-- server.c => src/server.c | 2 +- 9 files changed, 23 insertions(+), 25 deletions(-) create mode 100644 CMakeLists.txt delete mode 100644 Transmissão de Buffers entre Cliente e Servidor via Conexão por Socket.png rename graphic.py => data/graphic.py (100%) rename requirements.txt => data/requirements.txt (100%) create mode 100644 data/time_file1 delete mode 100644 makefile rename client.c => src/client.c (98%) rename server.c => src/server.c (98%) diff --git a/.gitignore b/.gitignore index c6127b3..42dea9d 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,19 @@ *.x86_64 *.hex +# CMake +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps + # Debug files *.dSYM/ *.su diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..26c451c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 2.8) +project(pingpong) +add_executable(./bin/server ./src/server.c) +add_executable(./bin/client ./src/client.c) diff --git a/Transmissão de Buffers entre Cliente e Servidor via Conexão por Socket.png b/Transmissão de Buffers entre Cliente e Servidor via Conexão por Socket.png deleted file mode 100644 index e5433318954881ea433913b1cba5b920f29f739d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33933 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 diff --git a/graphic.py b/data/graphic.py similarity index 100% rename from graphic.py rename to data/graphic.py diff --git a/requirements.txt b/data/requirements.txt similarity index 100% rename from requirements.txt rename to data/requirements.txt diff --git a/data/time_file1 b/data/time_file1 new file mode 100644 index 0000000..e5b7482 --- /dev/null +++ b/data/time_file1 @@ -0,0 +1,3 @@ +make[1]: Entrando no diretório '/home/silva/pingpong' +0.000912 +make[1]: Saindo do diretório '/home/silva/pingpong' diff --git a/makefile b/makefile deleted file mode 100644 index e5ff3d8..0000000 --- a/makefile +++ /dev/null @@ -1,22 +0,0 @@ -CC=gcc - -all: - @$(CC) client.c -o client - @$(CC) server.c -o server - @./server $(buffer_size)& - @./client $(buffer_size) - -clean: - @rm server client - -run_client: - @$(CC) client.c -o client - @./client $(buffer_size) - @rm server client - -run_server: - @$(CC) server.c -o server - @./server $(buffer_size)& - -graphic: - @python graphic.py \ No newline at end of file diff --git a/client.c b/src/client.c similarity index 98% rename from client.c rename to src/client.c index 6532db9..bec978d 100644 --- a/client.c +++ b/src/client.c @@ -11,7 +11,7 @@ #define TRUE 1 #define FALSE 0 #define HOST_IP "127.0.0.1" // IPV4 loopback address -#define SERVER_PORT 8099 // Server port +#define SERVER_PORT 8481 // Server port #define PORT_USED_CODE 256 #define SOCKET_ERROR_CODE -1 // Socket create, Connection server, Receive buffer to server code error #define SYSTEM_EXIT_FAILED 1 // Operating System program error response @@ -160,4 +160,4 @@ int main(int argc, char** argv) printf("%lf\n", (float)(average/(float)N)); return SYSTEM_EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/server.c b/src/server.c similarity index 98% rename from server.c rename to src/server.c index 0b215b9..5c708d4 100644 --- a/server.c +++ b/src/server.c @@ -9,7 +9,7 @@ #define FALSE 0 #define TRUE 1 #define HOST_IP "127.0.0.1" // IPV4 loopback address -#define SERVER_PORT 8099 // Server port +#define SERVER_PORT 8481 // Server port #define MAX_CONNECTIONS 10 // Num max client connected simultaneously #define SOCKET_ERROR_CODE -1 // Socket create, Connection server, Receive buffer to server code error #define SYSTEM_EXIT_FAILED 1 // Operating System program error response From 0e6ef7dc8a02c35ec5f0dbcd31213c3dfbc4f95b Mon Sep 17 00:00:00 2001 From: Vinicius Date: Sun, 26 Nov 2023 23:28:17 -0300 Subject: [PATCH 2/8] Socket TCP, UDP and UNIXDOMAIN connetions implemented --- CMakeLists.txt | 5 ++ bin/client | Bin 0 -> 17464 bytes bin/server | Bin 0 -> 17432 bytes dependences.dot | 27 +++++++++ dependences.png | Bin 0 -> 46098 bytes src/client.c | 145 +++++++++++++++++++++++++++++++----------------- src/server.c | 129 +++++++++++++++++++++++++++++++++--------- 7 files changed, 228 insertions(+), 78 deletions(-) create mode 100755 bin/client create mode 100755 bin/server create mode 100644 dependences.dot create mode 100644 dependences.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 26c451c..d821127 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,9 @@ cmake_minimum_required(VERSION 2.8) project(pingpong) + +execute_process( + COMMAND mkdir -p bin +) + add_executable(./bin/server ./src/server.c) add_executable(./bin/client ./src/client.c) diff --git a/bin/client b/bin/client new file mode 100755 index 0000000000000000000000000000000000000000..5cb54e6bf6fe8d92d2a177a652967b3e3982e9b9 GIT binary patch literal 17464 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 YS#YvlsY|D6Hv4;TH8f^e3@j}BZ%m|ZQ~&?~ literal 0 HcmV?d00001 diff --git a/bin/server b/bin/server new file mode 100755 index 0000000000000000000000000000000000000000..a270f934e6fa60761336f25b8f538cde6a2d890e GIT binary patch literal 17432 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 L#w3S legendNode1 [ style = solid ]; + legendNode0 -> legendNode2 [ style = solid ]; + legendNode0 -> legendNode3; + legendNode1 -> legendNode4 [ label = "Interface", style = dashed ]; + legendNode2 -> legendNode5 [ label = "Private", style = dotted ]; + legendNode3 -> legendNode6 [ style = solid ]; + legendNode0 -> legendNode7; +} + "node0" [ label = "./bin/client", shape = egg ]; + "node1" [ label = "./bin/server", shape = egg ]; +} diff --git a/dependences.png b/dependences.png new file mode 100644 index 0000000000000000000000000000000000000000..72ffa9d0c78fa85498e20e203e60a6ccfcf27012 GIT binary patch literal 46098 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 W-=3Tq7W+oQAHy+b261{bH~tT}V6+kd literal 0 HcmV?d00001 diff --git a/src/client.c b/src/client.c index bec978d..d65b96e 100644 --- a/src/client.c +++ b/src/client.c @@ -16,28 +16,42 @@ #define SOCKET_ERROR_CODE -1 // Socket create, Connection server, Receive buffer to server code error #define SYSTEM_EXIT_FAILED 1 // Operating System program error response #define SYSTEM_EXIT_SUCCESS 0 // Operating System program success response - - -#define KB 1024 +#define NUM_OF_ARGUMENTS 3 +#define TCP_SOCKET_FLAG 1 +#define UDP_SOCKET_FLAG 2 +#define UNIX_SOCKET_FLAG 3 float times[N]; -float send_elapsed_time_ms = 0.00; -float receive_elapsed_time_ms = 0.00; +int num_of_read_bytes = 0; +typedef struct sockaddr_in socket_address; +size_t buffer_size; +int socket_type; + +int domain, type, protocol; + +float elapsed_time_ms = 0.00; + +ssize_t (*send_generic_fn)(int __fd, const void *__buf, size_t __n, int __flags); +ssize_t (*recv_generic_fn)(int __fd, void *__buf, size_t __n, int __flags); + +int domain, type, protocol, sin_family, address, sock; typedef struct sockaddr_in socket_address; +void panic(char* message) +{ + perror(message); + exit(SYSTEM_EXIT_FAILED); +} + int init_socket() { - // AF_INET -> IPV4 Family - // SOCK_STREAM -> TCP Socket initialization - // IPPROTO_TCP -> TCP Explicit protocol - int client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + int client_socket = socket(sin_family, sock, IPPROTO_TCP); if(client_socket == SOCKET_ERROR_CODE) { - perror("Socket create failed!\n"); - exit(SYSTEM_EXIT_FAILED); + panic("Socket create failed!\n"); } return client_socket; @@ -47,9 +61,9 @@ socket_address config_server_address() { socket_address server_address; - server_address.sin_family = AF_INET; // IPV4 ips family + server_address.sin_family = sin_family; server_address.sin_port = htons(SERVER_PORT); - server_address.sin_addr.s_addr = inet_addr(HOST_IP); + server_address.sin_addr.s_addr = address; return server_address; } @@ -65,26 +79,32 @@ void connect_to_server(int client_socket, socket_address server_address) if(connection_response == SOCKET_ERROR_CODE) { - perror("Server connection error\n"); + close(client_socket); - exit(SYSTEM_EXIT_FAILED); + panic("Server connection error\n"); } } int receive_buffer(int client_socket, int buffer_size) { - ssize_t bytes_read; - int received_buffer[buffer_size]; - - recv(client_socket, received_buffer, buffer_size, 0); - + recv_generic_fn(client_socket, received_buffer, buffer_size, 0); + + for(int i = 0; i < buffer_size; i++) + { + printf("%d", received_buffer[i]); + } + printf("\nRECEBIDO\n"); } - void send_buffer(int client_socket, int buffer[], size_t buffer_size) { - send(client_socket, buffer, buffer_size, 0); + for(int i = 0; i < num_of_read_bytes; i++) + { + printf("ENVIO %d\n", i); + send_generic_fn(client_socket, buffer, buffer_size, 0); + receive_buffer(client_socket, buffer_size); + } } void controlc_handler() @@ -98,42 +118,69 @@ void socket_listen(int client_socket, int buffer[], size_t buffer_size) if(signal(SIGINT, controlc_handler) == SIG_ERR) { - perror("Signal create error!"); - exit(SYSTEM_EXIT_FAILED); + panic("Signal create error!"); } - clock_t start_send_time = clock(); + clock_t start_time = clock(); send_buffer(client_socket, buffer, buffer_size); - clock_t end_send_time = clock(); + clock_t end_time = clock(); - clock_t send_difference = (end_send_time - start_send_time); - send_elapsed_time_ms = ((float)send_difference / (CLOCKS_PER_SEC/1000)); - - clock_t start_receive_time = clock(); - receive_buffer(client_socket, buffer_size); - clock_t end_receive_time = clock(); - - clock_t receive_difference = (end_receive_time - start_receive_time); - receive_elapsed_time_ms = ((float)receive_difference / (CLOCKS_PER_SEC/1000)); + elapsed_time_ms = ((float)(end_time - start_time) / (CLOCKS_PER_SEC/1000)); } -float calculate() + +void attribuite_socket_type(int socket_type) { - - float average_total = 0.00; - - for(int i = 0; i < N; i++){ - average_total += times[i]; + switch (socket_type) + { + case TCP_SOCKET_FLAG: // TCP SOCKET + sin_family = AF_INET; + send_generic_fn = &send; + recv_generic_fn = &recv; + address = inet_addr(HOST_IP); + sock = SOCK_STREAM; + break; + + case UDP_SOCKET_FLAG: // UDP SOCKET + send_generic_fn = &sendto; + recv_generic_fn = &recvfrom; + address = INADDR_ANY; + sock = SOCK_DGRAM; + break; + + case UNIX_SOCKET_FLAG: // UNIXDOMAIN SOCKET + sin_family = AF_UNIX; + send_generic_fn = &send; + recv_generic_fn = &recv; + address = inet_addr(HOST_IP); + sock = SOCK_STREAM; + break; + + default: + panic("Value error!"); + break; } - - return average_total; } +void get_args(int argc, char** argv) +{ + if(argc > NUM_OF_ARGUMENTS) + { + buffer_size = (int)atoi(argv[1]); + num_of_read_bytes = (int)atoi(argv[2]); + socket_type = (int)atoi(argv[3]); + }else + { + panic("Argument is missing!"); + } + +} int main(int argc, char** argv) { - size_t buffer_size = (int)atoi(argv[1]); + get_args(argc, argv); + attribuite_socket_type(socket_type); int buffer[buffer_size]; @@ -149,15 +196,9 @@ int main(int argc, char** argv) connect_to_server(client_socket, server_address); - for(int i = 0; i < N; i++){ + socket_listen(client_socket, buffer, buffer_size); - socket_listen(client_socket, buffer, buffer_size); - times[i] = send_elapsed_time_ms + receive_elapsed_time_ms; - } - - float average = calculate(); - - printf("%lf\n", (float)(average/(float)N)); + printf("%lf\n", (float)(elapsed_time_ms)); return SYSTEM_EXIT_SUCCESS; } diff --git a/src/server.c b/src/server.c index 5c708d4..8df95d5 100644 --- a/src/server.c +++ b/src/server.c @@ -10,24 +10,47 @@ #define TRUE 1 #define HOST_IP "127.0.0.1" // IPV4 loopback address #define SERVER_PORT 8481 // Server port -#define MAX_CONNECTIONS 10 // Num max client connected simultaneously +#define MAX_CONNECTIONS 1 // Num max client connected simultaneously #define SOCKET_ERROR_CODE -1 // Socket create, Connection server, Receive buffer to server code error #define SYSTEM_EXIT_FAILED 1 // Operating System program error response #define SYSTEM_EXIT_SUCCESS 0 // Operating System program success response -#define KB 1024 +#define NUM_OF_ARGUMENTS 3 +#define TCP_SOCKET_FLAG 1 +#define UDP_SOCKET_FLAG 2 +#define UNIX_SOCKET_FLAG 3 +int num_of_read_bytes = 0; typedef struct sockaddr_in socket_address; +size_t buffer_size; +int socket_type; + +ssize_t (*send_fn); +ssize_t recv_fn = NULL; + +ssize_t (*send_generic_fn); +ssize_t (*recv_generic_fn); + + + +//(int __fd, void *__buf, size_t __n, int __flags); + +int domain, type, protocol, sin_family, address, sock; + +void panic(char* message) +{ + perror(message); + exit(SYSTEM_EXIT_FAILED); +} int create_socket() { int server_socket; - server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + server_socket = socket(sin_family, sock, IPPROTO_TCP); if(server_socket == SOCKET_ERROR_CODE) { - perror("Socket create failed!"); - exit(SYSTEM_EXIT_FAILED); + panic("Socket create failed!"); } return server_socket; @@ -36,10 +59,10 @@ int create_socket() socket_address config_server_address() { socket_address server_address; - - server_address.sin_family = AF_INET; // IPV4 ips family + + server_address.sin_family = sin_family; server_address.sin_port = htons(SERVER_PORT); - server_address.sin_addr.s_addr = inet_addr(HOST_IP); + server_address.sin_addr.s_addr = address; return server_address; } @@ -53,9 +76,8 @@ void bind_server(int server_socket, socket_address server_address) if(server_bind_response == SOCKET_ERROR_CODE) { - perror("Bind server error"); close(server_socket); - exit(SYSTEM_EXIT_FAILED); + panic("Bind server error"); } } @@ -67,34 +89,30 @@ int accept_connection(int client_socket, int server_socket, socket_address clien if(client_socket == SYSTEM_EXIT_FAILED) { - perror("Accept connection error!"); - exit(SYSTEM_EXIT_FAILED); - + panic("Accept connection error!"); }else{ return client_socket; } - } void send_buffer(int client_socket, int buffer[], int buffer_size) { - send(client_socket, buffer, buffer_size, 0); + send_fn(client_socket, buffer, buffer_size, 0); } - int receive_buffer(int client_socket, int buffer_size) { ssize_t bytes_read; int received_buffer[buffer_size]; - - while((bytes_read = recv(client_socket, received_buffer, buffer_size, 0)) > 0) + + for(int i = 0; i < num_of_read_bytes; i++) { - - received_buffer[bytes_read] = '\0'; - - send_buffer(client_socket, received_buffer, buffer_size); + while((bytes_read = recv_fn(client_socket, received_buffer, buffer_size, 0)) > 0) + { + send_buffer(client_socket, received_buffer, buffer_size); + } } } @@ -104,15 +122,14 @@ void controlc_handler() exit(SYSTEM_EXIT_SUCCESS); } - void server_listen(int client_socket, int server_socket, socket_address client_address, socklen_t client_addr_len, int buffer_size) { if (listen(server_socket, MAX_CONNECTIONS) == SOCKET_ERROR_CODE) { - perror("Listening mode error"); + close(server_socket); - exit(SYSTEM_EXIT_FAILED); + panic("Listening mode error"); } printf("[SERVER] - Server TCP listening on port %d...\n", SERVER_PORT); @@ -121,10 +138,68 @@ void server_listen(int client_socket, int server_socket, socket_address client_a receive_buffer(client_socket, buffer_size); } +void attribuite_socket_type(int socket_type) +{ + switch (socket_type) + { + case TCP_SOCKET_FLAG: // TCP SOCKET + sin_family = AF_INET; + + send_generic_fn = &send; + recv_generic_fn = &recv; + address = inet_addr(HOST_IP); + sock = SOCK_STREAM; + break; + + case UDP_SOCKET_FLAG: // UDP SOCKET + ssize_t (*send_generic_fn)(int __fd, const void *__buf, size_t __n, int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len); + ssize_t (*recv_generic_fn)(int __fd, void *__restrict __buf, size_t __n, int __flags, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len); + + send_generic_fn = &sendto; + recv_generic_fn = &recvfrom; + + send_fn = &send_generic_fn; + recv_fn = &recv_generic_fn; + + address = INADDR_ANY; + sock = SOCK_DGRAM; + break; + + case UNIX_SOCKET_FLAG: // UNIXDOMAIN SOCKET + sin_family = AF_UNIX; + send_generic_fn(int __fd, const void *__buf, size_t __n, int __flags); + send_generic_fn = &send; + recv_generic_fn = &recv; + address = inet_addr(HOST_IP); + sock = SOCK_STREAM; + break; + + default: + panic("Value error!"); + break; + } +} + +void get_args(int argc, char** argv) +{ + if(argc > NUM_OF_ARGUMENTS) + { + buffer_size = (int)atoi(argv[1]); + num_of_read_bytes = (int)atoi(argv[2]); + socket_type = (int)atoi(argv[3]); + }else + { + panic("Argument is missing!"); + } + +} + int main(int argc, char** argv) { - size_t buffer_size = 8192; + get_args(argc, argv); + attribuite_socket_type(socket_type); + int buffer[buffer_size]; int server_socket, client_socket; @@ -139,4 +214,6 @@ int main(int argc, char** argv) bind_server(server_socket, server_address); server_listen(client_socket, server_socket, client_address, client_addr_len, buffer_size); + + return SYSTEM_EXIT_SUCCESS; } From c1ce100bcb0016a5bc39a83c110dbdaee5c1a078 Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Mon, 27 Nov 2023 15:55:30 -0300 Subject: [PATCH 3/8] Funtion recv, recvfrom, send, sendto implemented to differents socket connections: UDP, TCP, UNIXDOMAIN --- bin/client | Bin 17464 -> 17408 bytes bin/server | Bin 17432 -> 17432 bytes src/client.c | 34 +++++++++++++++++++++------------ src/server.c | 52 ++++++++++++++++++++------------------------------- 4 files changed, 42 insertions(+), 44 deletions(-) diff --git a/bin/client b/bin/client index 5cb54e6bf6fe8d92d2a177a652967b3e3982e9b9..a7343ca0b5745f9aa18f9dd90eb18b147cb576d5 100755 GIT binary patch delta 4157 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 D-7r!4 delta 4110 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 diff --git a/bin/server b/bin/server index a270f934e6fa60761336f25b8f538cde6a2d890e..2478c84eb2f331c841675c34c0040277dcf2cd21 100755 GIT binary patch delta 4101 zcmZu!4Nw%<9e;bUa^T%@cYw#C;qGw6Pw*h32S!=MjY}dereU;I0tB$wA&AIz{5p@! zC5D{^YVz8YnD{ldGtOA2>X`||B%Z~DV|^C`7?ODH0O{t>Ae0a7t$khqQ!}?#;r9!QTH!@wtLs` zY2s}*6*x-qW`%D>$f*Ka;vT?B{1%SjOI0K32jL-=Iys`DiJ4u8F~Ms% zf;!b*~cB*b@KgBmweksLKb#>jg+G>0-u`ju< zX;VXUTXk)HeQR}7Lo+_^dD{8>rsn$UtqrZeY-mL-wauIA&?HvF)~&cdX&)Xea^TLX z%khP&ueeM)viS&|e)aV!2*sgvs(UjwB_gClGw~LKjpt|?+%mNeZ7C7O_1ypCntrKR z#UV7(;T)q4M-2vJWD;t?RmN3znC(PcN398f#N+qD=RKpr*f@2K!9UFwA9aFpu+%Mlg-uw8*l&_il3LgGQ2L^d>W*CoB5Me>FSFHhS}# zrjN?Aj^|?0vfdA)PjV1ScC18*L<0Sz82$Yi{p}e2c#Qu07=3??{+mg90ZG_32_X8* zF}g2C_u@;InH4i&*X6XIfNgAJZnEPgm?1(!*Rt(^2wiL|5ryMzX@bNqCgYbwZHe+w zvZI~w`l$qdnZhqvfuFX{U|8H}&78*qguL@Bg}}1w3t%XSH`)w>wCqbzB6e8BNIk6d zpV+Gl@Cj@Atgir;*vrtrOHQKrsThu&0hY)|1HP#2O@?yna8^o=y$d)SMSke4%LS1R z{zsNUyDqWYabrp*vk||NQkhr-C^)<`72imCmf4DnQXhNHDf(^+qIXEFjD-0p*-VM8 zosUppT-P>T;v+)cpdfjNB>q+(*bw9oL}ht6TQy1LQEDv_FRboj6TnmB?F1ffPo1w9 z!u$XUjE|)Tv(J+#!!1%}uOO9QlKA%oWm2!hq$DwA49gAeJCijbG>| zXR#929ah2*FP#8W>IUOkQdp!O-%fM;{|b6wT=v=}ejLn4h;J8LNZFY%u@A^H16HD9 zy^8Y&;7R3Uf&`UFl@ZB1F8QJ*;(#Dt6vPiB$*}yeaZ=?SiI0kZhrs=S?449m;FekR zMFW0cG_I`@HaO0|1A3-S552A}XSgZMzCDNhxGA~s!H*fKej20|*&|>Gvj?Cjze&Su z!fZE;Nei-kp zm@E&1{OX=8kAc+Rmt`~T@)3}3kgK7J3XoxtEg5 zWm~-M-{1~mw3ZHoPI!I_<-ybu;!Wl~x>Dm57|wv_C_Hr|*p!vY?7=x%4km=lvmCl9 zqqsRMvzCM6n}9LlrK>X}z}7nf5+F+_*p;h?7L^ag#d#TpLozo3XBZ~xg7HKQ7?R8# zV7r5FXE|I=umq%z35M>V5`nM=fHj75W;%2~z8Cz_%&!xZw7URG!7Fldb)F2|nzNf( zh(~gYnI4>%>tH;1O|C;1Lc!MDRgB$2BE#vS(n+P;f-jmDW4-&3eedKyQ=mHG(ZQ`G zgwMHcI>_@6_mes<1!v`TlXR!@zGSxGH}W02E7S11`Pud$Yzw*Q#ooYo<8ykOzZ+&i ztWFNXLW@@gIz;grP6afaT(^JdUV0jEaxaa&o|7w|87_=w8i$5QAFF)pBNy3A-Ai^eKXBVWI$OQrZ*6F(i*B0CG=f##pj=r`W9w}au zUO_cYYQK02eJy9PXd9%-&+v9`VUj09jq1q=p5mU=>1q((!DZs~(nCxF?kiowEWsnC Gv;PMGLjkJ* delta 3931 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 diff --git a/src/client.c b/src/client.c index d65b96e..01842ef 100644 --- a/src/client.c +++ b/src/client.c @@ -25,6 +25,8 @@ float times[N]; int num_of_read_bytes = 0; typedef struct sockaddr_in socket_address; +socket_address server_address; + size_t buffer_size; int socket_type; @@ -32,9 +34,6 @@ int domain, type, protocol; float elapsed_time_ms = 0.00; -ssize_t (*send_generic_fn)(int __fd, const void *__buf, size_t __n, int __flags); -ssize_t (*recv_generic_fn)(int __fd, void *__buf, size_t __n, int __flags); - int domain, type, protocol, sin_family, address, sock; typedef struct sockaddr_in socket_address; @@ -88,8 +87,14 @@ void connect_to_server(int client_socket, socket_address server_address) int receive_buffer(int client_socket, int buffer_size) { int received_buffer[buffer_size]; - recv_generic_fn(client_socket, received_buffer, buffer_size, 0); + if(socket_type != UDP_SOCKET_FLAG) recv(client_socket, received_buffer, buffer_size, 0); + else + { + socklen_t* server_addr_size = (socklen_t*)sizeof(server_address); + recvfrom(client_socket, received_buffer, buffer_size, 0, (struct sockaddr *)&server_address, server_addr_size); + } + for(int i = 0; i < buffer_size; i++) { printf("%d", received_buffer[i]); @@ -102,7 +107,12 @@ void send_buffer(int client_socket, int buffer[], size_t buffer_size) for(int i = 0; i < num_of_read_bytes; i++) { printf("ENVIO %d\n", i); - send_generic_fn(client_socket, buffer, buffer_size, 0); + + socklen_t server_addr_size = (socklen_t)sizeof(server_address); + + if(socket_type != UDP_SOCKET_FLAG) send(client_socket, buffer, buffer_size, 0); + else sendto(client_socket, buffer, buffer_size, 0, (const struct sockaddr *)&server_address, server_addr_size); + receive_buffer(client_socket, buffer_size); } } @@ -134,26 +144,27 @@ void attribuite_socket_type(int socket_type) switch (socket_type) { case TCP_SOCKET_FLAG: // TCP SOCKET + sin_family = AF_INET; - send_generic_fn = &send; - recv_generic_fn = &recv; address = inet_addr(HOST_IP); sock = SOCK_STREAM; + break; case UDP_SOCKET_FLAG: // UDP SOCKET - send_generic_fn = &sendto; - recv_generic_fn = &recvfrom; + + sin_family = AF_INET; address = INADDR_ANY; sock = SOCK_DGRAM; + break; case UNIX_SOCKET_FLAG: // UNIXDOMAIN SOCKET + sin_family = AF_UNIX; - send_generic_fn = &send; - recv_generic_fn = &recv; address = inet_addr(HOST_IP); sock = SOCK_STREAM; + break; default: @@ -191,7 +202,6 @@ int main(int argc, char** argv) int client_socket = init_socket(); - socket_address server_address; server_address = config_server_address(); connect_to_server(client_socket, server_address); diff --git a/src/server.c b/src/server.c index 8df95d5..2a61755 100644 --- a/src/server.c +++ b/src/server.c @@ -11,9 +11,9 @@ #define HOST_IP "127.0.0.1" // IPV4 loopback address #define SERVER_PORT 8481 // Server port #define MAX_CONNECTIONS 1 // Num max client connected simultaneously -#define SOCKET_ERROR_CODE -1 // Socket create, Connection server, Receive buffer to server code error -#define SYSTEM_EXIT_FAILED 1 // Operating System program error response -#define SYSTEM_EXIT_SUCCESS 0 // Operating System program success response +#define SOCKET_ERROR_CODE -1 // Socket create, Connection server, Receive buffer to server code error +#define SYSTEM_EXIT_FAILED 1 // Operating System program error response +#define SYSTEM_EXIT_SUCCESS 0 // Operating System program success response #define NUM_OF_ARGUMENTS 3 #define TCP_SOCKET_FLAG 1 #define UDP_SOCKET_FLAG 2 @@ -21,19 +21,13 @@ int num_of_read_bytes = 0; typedef struct sockaddr_in socket_address; + +socket_address client_address; +socklen_t client_addr_len; + size_t buffer_size; int socket_type; -ssize_t (*send_fn); -ssize_t recv_fn = NULL; - -ssize_t (*send_generic_fn); -ssize_t (*recv_generic_fn); - - - -//(int __fd, void *__buf, size_t __n, int __flags); - int domain, type, protocol, sin_family, address, sock; void panic(char* message) @@ -97,19 +91,24 @@ int accept_connection(int client_socket, int server_socket, socket_address clien void send_buffer(int client_socket, int buffer[], int buffer_size) { - - send_fn(client_socket, buffer, buffer_size, 0); + socklen_t client_addr_size = (socklen_t)sizeof(client_address); + + if(socket_type != UDP_SOCKET_FLAG) send(client_socket, buffer, buffer_size, 0); + else sendto(client_socket, buffer, buffer_size, 0, (const struct sockaddr *)&client_address, client_addr_size); } int receive_buffer(int client_socket, int buffer_size) { ssize_t bytes_read; + socklen_t* client_addr_size = (socklen_t*)sizeof(client_address); + int received_buffer[buffer_size]; for(int i = 0; i < num_of_read_bytes; i++) { - while((bytes_read = recv_fn(client_socket, received_buffer, buffer_size, 0)) > 0) + + while((bytes_read = socket_type == UDP_SOCKET_FLAG ? recv(client_socket, received_buffer, buffer_size, 0) : recvfrom(client_socket, received_buffer, buffer_size, 0, (struct sockaddr *)&client_address, client_addr_size)) > 0) { send_buffer(client_socket, received_buffer, buffer_size); } @@ -145,33 +144,22 @@ void attribuite_socket_type(int socket_type) case TCP_SOCKET_FLAG: // TCP SOCKET sin_family = AF_INET; - send_generic_fn = &send; - recv_generic_fn = &recv; address = inet_addr(HOST_IP); sock = SOCK_STREAM; break; case UDP_SOCKET_FLAG: // UDP SOCKET - ssize_t (*send_generic_fn)(int __fd, const void *__buf, size_t __n, int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len); - ssize_t (*recv_generic_fn)(int __fd, void *__restrict __buf, size_t __n, int __flags, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len); - - send_generic_fn = &sendto; - recv_generic_fn = &recvfrom; - - send_fn = &send_generic_fn; - recv_fn = &recv_generic_fn; - + address = INADDR_ANY; sock = SOCK_DGRAM; break; case UNIX_SOCKET_FLAG: // UNIXDOMAIN SOCKET + sin_family = AF_UNIX; - send_generic_fn(int __fd, const void *__buf, size_t __n, int __flags); - send_generic_fn = &send; - recv_generic_fn = &recv; address = inet_addr(HOST_IP); sock = SOCK_STREAM; + break; default: @@ -206,8 +194,8 @@ int main(int argc, char** argv) server_socket = create_socket(); - socket_address server_address, client_address; - socklen_t client_addr_len = sizeof(client_address); + socket_address server_address; + client_addr_len = sizeof(client_address); server_address = config_server_address(); From e9c29b1a43ea3a50ca992d77adba3cd7f70af94b Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Mon, 27 Nov 2023 16:25:53 -0300 Subject: [PATCH 4/8] Fix unix domain server implementation --- .vscode/settings.json | 3 ++- src/server.c | 28 +++++++++++++++++++++------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index b867064..88a1184 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,6 +7,7 @@ "signal.h": "c", "string.h": "c", "stdlib.h": "c", - "inet.h": "c" + "inet.h": "c", + "un.h": "c" } } \ No newline at end of file diff --git a/src/server.c b/src/server.c index 2a61755..389a9c5 100644 --- a/src/server.c +++ b/src/server.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -18,13 +19,17 @@ #define TCP_SOCKET_FLAG 1 #define UDP_SOCKET_FLAG 2 #define UNIX_SOCKET_FLAG 3 - +#define SOCK_PATH "pingpong.socket" int num_of_read_bytes = 0; typedef struct sockaddr_in socket_address; +typedef struct sockaddr_un socket_address_unix; socket_address client_address; socklen_t client_addr_len; +socket_address server_address; +socket_address_unix server_address_unix; + size_t buffer_size; int socket_type; @@ -52,13 +57,22 @@ int create_socket() socket_address config_server_address() { - socket_address server_address; - - server_address.sin_family = sin_family; - server_address.sin_port = htons(SERVER_PORT); - server_address.sin_addr.s_addr = address; - return server_address; + if(socket_type == UNIX_SOCKET_FLAG) + { + socket_address server_address; + server_address.sin_family = sin_family; + server_address.sin_port = htons(SERVER_PORT); + server_address.sin_addr.s_addr = address; + + + }else{ + + socket_address_unix server_address; + server_address.sun_family = AF_UNIX; + strcpy(server_address.sun_path, SOCK_PATH); + unlink(SOCK_PATH); + } } void bind_server(int server_socket, socket_address server_address) From a4fd493e18a714e84f6e5d0ac3197543c262dd6f Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Mon, 27 Nov 2023 16:51:31 -0300 Subject: [PATCH 5/8] graphic.py modified to log scale --- bin/server | Bin 17432 -> 17536 bytes data/graphic.py | 2 ++ data/main.py | 11 +++++++++++ 3 files changed, 13 insertions(+) create mode 100644 data/main.py diff --git a/bin/server b/bin/server index 2478c84eb2f331c841675c34c0040277dcf2cd21..19bad2703fdb52544499394e4dd0b9d97babd4c4 100755 GIT binary patch delta 4541 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 Gr~VfR*iv2q diff --git a/data/graphic.py b/data/graphic.py index 70627e8..44eed33 100644 --- a/data/graphic.py +++ b/data/graphic.py @@ -69,6 +69,8 @@ categorias = ["0,064KB","0,128KB","0,256KB","0,512KB","1KB","2KB","4KB","8KB"] plt.bar(categorias, valores, color='purple', width=0.8) +plt.yscale('log') + plt.xlabel('Tamanho do buffer em (KB)') plt.ylabel('Tempo de execução em (ms)') plt.title('Transmissão de Buffers entre Cliente e Servidor via Conexão por Socket') diff --git a/data/main.py b/data/main.py new file mode 100644 index 0000000..b9797ff --- /dev/null +++ b/data/main.py @@ -0,0 +1,11 @@ +import pylab +import matplotlib.pyplot as plt +a = [pow(10, i) for i in range(10)] +fig = plt.figure() +ax = fig.add_subplot(2, 1, 1) + +line, = ax.plot(a, color='blue', lw=2) + +ax.set_yscale('log') + +pylab.show() From 9ced8b783b8daa15635c0c45181c300a3be54b93 Mon Sep 17 00:00:00 2001 From: Vinicius Date: Wed, 29 Nov 2023 12:38:28 -0300 Subject: [PATCH 6/8] code adapted to work with sockaddr_in and sockaddr_un types --- src/client.c | 53 +++++++++++++++++++++++++++++++++++----------------- src/server.c | 15 ++++++++------- 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/src/client.c b/src/client.c index 01842ef..a701670 100644 --- a/src/client.c +++ b/src/client.c @@ -24,8 +24,18 @@ float times[N]; int num_of_read_bytes = 0; -typedef struct sockaddr_in socket_address; -socket_address server_address; + +typedef struct sockaddr_in socket_address_ipv4; +typedef struct sockaddr_un socket_address_unix; + +typedef union socketaddr_t +{ + socket_address_ipv4 socket_ipv4; + socket_address_unix socket_unix; +} socketaddr_t; + + +socketaddr_t server_address; size_t buffer_size; int socket_type; @@ -56,24 +66,32 @@ int init_socket() return client_socket; } -socket_address config_server_address() +socketaddr_t config_server_address() { - socket_address server_address; - server_address.sin_family = sin_family; - server_address.sin_port = htons(SERVER_PORT); - server_address.sin_addr.s_addr = address; + if(socket_type == UNIX_SOCKET_FLAG) + { + server_address.socket_ipv4.sin_family = sin_family; + server_address.socket_ipv4.sin_port = htons(SERVER_PORT); + server_address.socket_ipv4.sin_addr.s_addr = address; - return server_address; + + }else{ + + server_address.socket_unix.sun_family = AF_UNIX; + strcpy(server_address.socket_unix.sun_path, address); + unlink(address); + } } -void connect_to_server(int client_socket, socket_address server_address) +void connect_to_server(int client_socket) + { - struct sockaddr* address = (struct sockaddr*)&server_address; + struct sockaddr* address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&server_address.socket_unix : (struct sockaddr*)&server_address.socket_ipv4; int connection_response = connect(client_socket, address, - sizeof(server_address) + socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&server_address.socket_unix : (struct sockaddr*)&server_address.socket_unix; ); if(connection_response == SOCKET_ERROR_CODE) @@ -88,11 +106,12 @@ int receive_buffer(int client_socket, int buffer_size) { int received_buffer[buffer_size]; - if(socket_type != UDP_SOCKET_FLAG) recv(client_socket, received_buffer, buffer_size, 0); + if(socket_type == TCP_SOCKET_FLAG) recv(client_socket, received_buffer, buffer_size, 0); else { - socklen_t* server_addr_size = (socklen_t*)sizeof(server_address); - recvfrom(client_socket, received_buffer, buffer_size, 0, (struct sockaddr *)&server_address, server_addr_size); + struct sockaddr* address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&server_address.socket_unix : (struct sockaddr*)&server_address.socket_ipv4; + socklen_t* server_addr_size = socket_type == UNIX_SOCKET_FLAG ? (socklen_t*)sizeof(server_address.socket_unix) : (socklen_t*)sizeof(server_address.socket_ipv4); + recvfrom(client_socket, received_buffer, buffer_size, 0, address, server_addr_size); } for(int i = 0; i < buffer_size; i++) @@ -110,7 +129,7 @@ void send_buffer(int client_socket, int buffer[], size_t buffer_size) socklen_t server_addr_size = (socklen_t)sizeof(server_address); - if(socket_type != UDP_SOCKET_FLAG) send(client_socket, buffer, buffer_size, 0); + if(socket_type == TCP_SOCKET_FLAG) send(client_socket, buffer, buffer_size, 0); else sendto(client_socket, buffer, buffer_size, 0, (const struct sockaddr *)&server_address, server_addr_size); receive_buffer(client_socket, buffer_size); @@ -162,8 +181,8 @@ void attribuite_socket_type(int socket_type) case UNIX_SOCKET_FLAG: // UNIXDOMAIN SOCKET sin_family = AF_UNIX; - address = inet_addr(HOST_IP); - sock = SOCK_STREAM; + address = "pingpong.socket";; + sock = SOCK_DGRAM; break; diff --git a/src/server.c b/src/server.c index 389a9c5..b0a9e11 100644 --- a/src/server.c +++ b/src/server.c @@ -19,7 +19,6 @@ #define TCP_SOCKET_FLAG 1 #define UDP_SOCKET_FLAG 2 #define UNIX_SOCKET_FLAG 3 -#define SOCK_PATH "pingpong.socket" int num_of_read_bytes = 0; typedef struct sockaddr_in socket_address; typedef struct sockaddr_un socket_address_unix; @@ -70,8 +69,8 @@ socket_address config_server_address() socket_address_unix server_address; server_address.sun_family = AF_UNIX; - strcpy(server_address.sun_path, SOCK_PATH); - unlink(SOCK_PATH); + strcpy(server_address.sun_path, address); + unlink(address); } } @@ -82,6 +81,8 @@ void bind_server(int server_socket, socket_address server_address) int server_bind_response = bind(server_socket, address, sizeof(server_address)); + if (socket_type == UNIX_SOCKET_FLAG) unlink(address); + if(server_bind_response == SOCKET_ERROR_CODE) { close(server_socket); @@ -107,7 +108,7 @@ void send_buffer(int client_socket, int buffer[], int buffer_size) { socklen_t client_addr_size = (socklen_t)sizeof(client_address); - if(socket_type != UDP_SOCKET_FLAG) send(client_socket, buffer, buffer_size, 0); + if(socket_type == TCP_SOCKET_FLAG) send(client_socket, buffer, buffer_size, 0); else sendto(client_socket, buffer, buffer_size, 0, (const struct sockaddr *)&client_address, client_addr_size); } @@ -122,7 +123,7 @@ int receive_buffer(int client_socket, int buffer_size) for(int i = 0; i < num_of_read_bytes; i++) { - while((bytes_read = socket_type == UDP_SOCKET_FLAG ? recv(client_socket, received_buffer, buffer_size, 0) : recvfrom(client_socket, received_buffer, buffer_size, 0, (struct sockaddr *)&client_address, client_addr_size)) > 0) + while((bytes_read = socket_type == UNIX_SOCKET_FLAG ? recv(client_socket, received_buffer, buffer_size, 0) : recvfrom(client_socket, received_buffer, buffer_size, 0, (struct sockaddr *)&client_address, client_addr_size)) > 0) { send_buffer(client_socket, received_buffer, buffer_size); } @@ -171,8 +172,8 @@ void attribuite_socket_type(int socket_type) case UNIX_SOCKET_FLAG: // UNIXDOMAIN SOCKET sin_family = AF_UNIX; - address = inet_addr(HOST_IP); - sock = SOCK_STREAM; + address = "pingpong.socket"; + sock = SOCK_DGRAM; break; From 7e50c768dc3a22d74b14f069b9f04de366f4b38a Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Wed, 29 Nov 2023 21:04:01 -0300 Subject: [PATCH 7/8] UDP UNIX DOMAIN and TCP socket implemented --- bin/client | Bin 17408 -> 17496 bytes bin/server | Bin 17536 -> 17536 bytes src/client.c | 24 +++++++++------- src/server.c | 78 +++++++++++++++++++++++++++------------------------ 4 files changed, 56 insertions(+), 46 deletions(-) diff --git a/bin/client b/bin/client index a7343ca0b5745f9aa18f9dd90eb18b147cb576d5..d3458fc5eeb0022de847fc7bf20a2cae64ef8a23 100755 GIT binary patch delta 5074 zcmZ`-4^&iD8h>ww2MjXI41zO*xidqNkT?UR0;}jC`|5d)mh6d>ZI+7va5J=m)-`eP zkR9ecDez|LuAa1ZH(KkYQD@QI6Zj9@jsKnzrMzPuD*qtiqEy#$ly(Q<>q&yqr@@y@i`jakL>>@5WS`jWX!kPB2qj_DBHz#1>*MzN zh{e1n&HkU0|Mcy$_Dt5uL8$APkJo*H5FFI|v zp-)85LC;0cL(fN_f>EJ=)aiHnFR1;kBMBd*cM-|FL5 z9osCq#AQ0agLDF?kc*O&v_e`-eDMKs11ZP&u`aETk0VbPq%EmL1|9Iwbp{Kg#W5lj zf~F!{g){)PS9##8INoc(i;z?NGAG0P7!h6~js&Osey&ZUDM4#xMA$$|6P%&vp|!(@ zAh*et!W(#?HrJ;y$x5#H43zp@|2Y%He7?ZtMF!ud>-G^ykl|xvDwC5>5*%~h!ZWqG zo7-H=L7k9OAKo0x1Z7+v1*Q1g3~TKm`H9Yuo6p)hj=?|Tvr4&qH$MQkbNMh|-OjBg za(NcVhxzI;{3MRgHmqLF@OKEC`D=KN8#>7+++vteLM|pclfL2F8D~hU<@R!oSrN|i zyzd83+W`*CGkCd|<1cY98yQ?sx%?0bTkf|$QSh8ex&US%UMw}38G*k zonw|`SDA%ZFpVE;A#K$vE8UDK*mhL*cFPMm=4Qdg`Pz(C7C|rxxAJWnJNL1~)pJ+! zN|-M(d62Xum$_pbhUy}-7=qp+c5)%vIfuV9T^t>yEnq->403q_IG!C{u8fkK$pov@ zDvg@8fIMb(k_FaeE1ef>Rb&sOjgTUwk+zQXLfQ@~zX^3sBN0=aBw|f=BRwN+`>0h@ zh!uz#Dam3hS%N1eCE3b%n~rZMEs(BDNp|zMt4q5_Sx6_lQk@D&Dro`IJQe2IadI*KPtQ(g1d;jL=vVJOS0S*B^)ap?^b7<*6XsS|>rN{?YYNOxNJgK$^mT_i0mUvH?puGQM$ zjwhK~>5A;cJXOAa;s{M!1?(yfgLWlc7gZ%Y3^YW|wNq6o3y&+p(lgzH@Se|yHDAY? z5d01T#PcI1Fm?{ouoPMbb|8O6msEiVkplj$1CC?eyErr#P$-UZ)(W;+QRV0jj(Ed$ zgP3F2K{8z0h$re&!og|;HXt3O=T%YXMOArF(c?V&gXTq`mmBIXYqf5O;Z`YKt4Wfv zxv7_X$?CM}VmE0`dpXpjN(;KEO|f>oDz__3dla>{N0kp9fMEgPt^d=sfq9sH;5eNv z_o>oEeFB_lXHK;1PK4$Dn1Q-}xYWlD%?V$f6Yh?g8+%>Ty5ytO_`pO(Eth-LilfTX zkJPy4FilUyqWjoR0g)H6c7uFWROO@7<@OD|(7(_0kzA;h@aITbMP!*WDJ?4-6KbT$ z6mmU1Gc-h}pWlf=m4|e@^`q@((#f!OOpgd@EkC*h57H%fFc9e$f|9kbY(5n70|Vh*jxDApumG}YWb zu)0gSh?hry2#~-meQoJ8NV=pm80qaiu%Jsi`4dKDn7`?m16)2ZrAvB^<6-A3+|Wu` zB06Rp$Jhq!P@U0LU6I~vWSq-CZygO`JFp(05XX?x&|z0peOoVtE-XEHWJKZOiZWgC z9TWrf@NbVxK4!X8OgEqD7BF2m z)19Csq;6i!lvPZ5h$;WhCaz_=bxgO9>Gtb7xgJ}g5&8NnlkR0wdTeMG|HPz!22tg= z5w%qhA$_L~o7Vv$-9H6g5dr5G+eG>!G}t#MhHby;UZL1F(xJKoS+(G|mu5nw8@1#L zc_bqv{o;3swrP3agQW{gA1ZygbkRe|ZQJ$?Z`@XIoo(%^>XmEPRIl_uv1aKb%WKF6 zZ&9e~TTP?MY#q|He$aN%D7AP|({_XQUeYu>miQht7xb6Inl=~oFz9N~oXeWF1@u#_ zybtvCE1K2=dJ=RHbm8}!mWLzn zdgTrJhjqOdvP9V42EG3M7n?6Pn9Z+Jx1 zOpi}N8tC@^$)T4n)pXn(Ptt$ezgo{MPj1IY2H>4mh&;*ALIS&`t9F z9!Hgx&BEE#8@{Lf_li|yzuzN9Nw0sUsi*{%**G#k&}a$L?;^DMq&M)1qi6IN7o=X& zo9DFLi6;|2XM^N)UcepuG^Mj>+kj5B^~9I&6thWj{@rkOQ+~kIKc2jm?-z^6St#1c z)%*a|IRydBNMS^l6ilb(9K1uxCvGMC3!LK9WD~|0=@|M7q0w^1ShmrO->j56$mPaT z>KK|`6i37FBQK*)Wz*&7=jZ?9!2Kbd-(*sh8jRr?_2X2|LK;#)|72@lAE+ z_w$vE<+TOgQ!fwEGmG{VBSI=Eo#qTpg!X0yaW0QJ7-aAu{hUC1f%{-AD+{B!B_<^hMaC6V_CV9h9R!kM^ztp>f=7LXPVRf4?b&#p&0#; z^iFe5{hDiyweS`0gRv@=;*d(5!?d>i!u!NjR$m71o;zoD*`fk}fqyDdk|w0G>T|TX zZFf<>xozW&O3{=pkuOX9j&6LA(H5ft;+q+8M0x!cqt#@|%z&i|-|DngksUJ&Ev=ku zC8uW=j$9nE3#6O)W`%Hv@0k^_EavybVsd&`p<^xQVl4i4w<~W$d|J>n!E|5vTRz?V)~a5nk$aHTsBQyM^2Yb{6E-(74!fA delta 4624 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 delta 4886 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 HRbBsIaXHHR diff --git a/src/client.c b/src/client.c index a701670..861e2d1 100644 --- a/src/client.c +++ b/src/client.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -32,6 +33,7 @@ typedef union socketaddr_t { socket_address_ipv4 socket_ipv4; socket_address_unix socket_unix; + } socketaddr_t; @@ -44,7 +46,8 @@ int domain, type, protocol; float elapsed_time_ms = 0.00; -int domain, type, protocol, sin_family, address, sock; +char* address; +int domain, type, protocol, sin_family, sock; typedef struct sockaddr_in socket_address; @@ -73,7 +76,7 @@ socketaddr_t config_server_address() { server_address.socket_ipv4.sin_family = sin_family; server_address.socket_ipv4.sin_port = htons(SERVER_PORT); - server_address.socket_ipv4.sin_addr.s_addr = address; + server_address.socket_ipv4.sin_addr.s_addr = inet_addr(address); }else{ @@ -90,8 +93,8 @@ void connect_to_server(int client_socket) struct sockaddr* address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&server_address.socket_unix : (struct sockaddr*)&server_address.socket_ipv4; int connection_response = connect(client_socket, - address, - socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&server_address.socket_unix : (struct sockaddr*)&server_address.socket_unix; + address, + socket_type == UNIX_SOCKET_FLAG ? (socklen_t)sizeof(server_address.socket_unix) : (socklen_t)sizeof(server_address.socket_ipv4) ); if(connection_response == SOCKET_ERROR_CODE) @@ -109,7 +112,7 @@ int receive_buffer(int client_socket, int buffer_size) if(socket_type == TCP_SOCKET_FLAG) recv(client_socket, received_buffer, buffer_size, 0); else { - struct sockaddr* address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&server_address.socket_unix : (struct sockaddr*)&server_address.socket_ipv4; + struct sockaddr* address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&server_address.socket_unix : (struct sockaddr*)&server_address.socket_ipv4; socklen_t* server_addr_size = socket_type == UNIX_SOCKET_FLAG ? (socklen_t*)sizeof(server_address.socket_unix) : (socklen_t*)sizeof(server_address.socket_ipv4); recvfrom(client_socket, received_buffer, buffer_size, 0, address, server_addr_size); } @@ -127,10 +130,11 @@ void send_buffer(int client_socket, int buffer[], size_t buffer_size) { printf("ENVIO %d\n", i); - socklen_t server_addr_size = (socklen_t)sizeof(server_address); + struct sockaddr* address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&server_address.socket_unix : (struct sockaddr*)&server_address.socket_ipv4; + socklen_t server_addr_size = socket_type == UNIX_SOCKET_FLAG ? (socklen_t)sizeof(server_address.socket_unix) : (socklen_t)sizeof(server_address.socket_ipv4); if(socket_type == TCP_SOCKET_FLAG) send(client_socket, buffer, buffer_size, 0); - else sendto(client_socket, buffer, buffer_size, 0, (const struct sockaddr *)&server_address, server_addr_size); + else sendto(client_socket, buffer, buffer_size, 0, address, server_addr_size); receive_buffer(client_socket, buffer_size); } @@ -165,7 +169,7 @@ void attribuite_socket_type(int socket_type) case TCP_SOCKET_FLAG: // TCP SOCKET sin_family = AF_INET; - address = inet_addr(HOST_IP); + address = HOST_IP; sock = SOCK_STREAM; break; @@ -173,7 +177,7 @@ void attribuite_socket_type(int socket_type) case UDP_SOCKET_FLAG: // UDP SOCKET sin_family = AF_INET; - address = INADDR_ANY; + address = HOST_IP; sock = SOCK_DGRAM; break; @@ -223,7 +227,7 @@ int main(int argc, char** argv) server_address = config_server_address(); - connect_to_server(client_socket, server_address); + connect_to_server(client_socket); socket_listen(client_socket, buffer, buffer_size); diff --git a/src/server.c b/src/server.c index b0a9e11..55d597a 100644 --- a/src/server.c +++ b/src/server.c @@ -20,19 +20,28 @@ #define UDP_SOCKET_FLAG 2 #define UNIX_SOCKET_FLAG 3 int num_of_read_bytes = 0; -typedef struct sockaddr_in socket_address; + +typedef struct sockaddr_in socket_address_ipv4; typedef struct sockaddr_un socket_address_unix; -socket_address client_address; + socklen_t client_addr_len; -socket_address server_address; -socket_address_unix server_address_unix; +typedef union socketaddr_t +{ + socket_address_ipv4 socket_ipv4; + socket_address_unix socket_unix; + +} socketaddr_t; + +socketaddr_t client_address; +socketaddr_t server_address; size_t buffer_size; int socket_type; -int domain, type, protocol, sin_family, address, sock; +char* address; +int domain, type, protocol, sin_family, sock; void panic(char* message) { @@ -54,34 +63,32 @@ int create_socket() return server_socket; } -socket_address config_server_address() +void config_server_address() { if(socket_type == UNIX_SOCKET_FLAG) { - socket_address server_address; - server_address.sin_family = sin_family; - server_address.sin_port = htons(SERVER_PORT); - server_address.sin_addr.s_addr = address; + server_address.socket_ipv4.sin_family = sin_family; + server_address.socket_ipv4.sin_port = htons(SERVER_PORT); + server_address.socket_ipv4.sin_addr.s_addr = inet_addr(address); }else{ - socket_address_unix server_address; - server_address.sun_family = AF_UNIX; - strcpy(server_address.sun_path, address); - unlink(address); + server_address.socket_unix.sun_family = AF_UNIX; + strcpy(server_address.socket_unix.sun_path, address); + unlink((const char*)address); } } -void bind_server(int server_socket, socket_address server_address) +void bind_server(int server_socket) { - struct sockaddr* address = (struct sockaddr*)&server_address; + struct sockaddr* address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&server_address.socket_unix : (struct sockaddr*)&server_address.socket_ipv4; - int server_bind_response = bind(server_socket, address, sizeof(server_address)); + int server_bind_response = bind(server_socket, address, socket_type == UNIX_SOCKET_FLAG ? sizeof(server_address.socket_unix) : sizeof(server_address.socket_ipv4)); - if (socket_type == UNIX_SOCKET_FLAG) unlink(address); + if (socket_type == UNIX_SOCKET_FLAG) unlink((const char*)address); if(server_bind_response == SOCKET_ERROR_CODE) { @@ -90,9 +97,10 @@ void bind_server(int server_socket, socket_address server_address) } } -int accept_connection(int client_socket, int server_socket, socket_address client_address, socklen_t client_addr_len) +int accept_connection(int client_socket, int server_socket) { - struct sockaddr *address = (struct sockaddr*)&client_address; + socklen_t client_addr_len = socket_type == UNIX_SOCKET_FLAG ? sizeof(client_address.socket_ipv4) : sizeof(client_address.socket_unix); + struct sockaddr *address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&client_address.socket_unix : (struct sockaddr*)&client_address.socket_ipv4; client_socket = accept(server_socket, address, &client_addr_len); @@ -106,24 +114,25 @@ int accept_connection(int client_socket, int server_socket, socket_address clien void send_buffer(int client_socket, int buffer[], int buffer_size) { - socklen_t client_addr_size = (socklen_t)sizeof(client_address); + socklen_t client_addr_len = socket_type == UNIX_SOCKET_FLAG ? sizeof(client_address.socket_ipv4) : sizeof(client_address.socket_unix); + struct sockaddr *address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&client_address.socket_unix : (struct sockaddr*)&client_address.socket_ipv4; if(socket_type == TCP_SOCKET_FLAG) send(client_socket, buffer, buffer_size, 0); - else sendto(client_socket, buffer, buffer_size, 0, (const struct sockaddr *)&client_address, client_addr_size); + else sendto(client_socket, buffer, buffer_size, 0, address, client_addr_len); } int receive_buffer(int client_socket, int buffer_size) { ssize_t bytes_read; - socklen_t* client_addr_size = (socklen_t*)sizeof(client_address); - + socklen_t* client_addr_len = socket_type == UNIX_SOCKET_FLAG ? (socklen_t *)sizeof(client_address.socket_ipv4) : (socklen_t *)sizeof(client_address.socket_unix); + struct sockaddr *address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&client_address.socket_unix : (struct sockaddr*)&client_address.socket_ipv4; int received_buffer[buffer_size]; for(int i = 0; i < num_of_read_bytes; i++) { - while((bytes_read = socket_type == UNIX_SOCKET_FLAG ? recv(client_socket, received_buffer, buffer_size, 0) : recvfrom(client_socket, received_buffer, buffer_size, 0, (struct sockaddr *)&client_address, client_addr_size)) > 0) + while((bytes_read = socket_type == UNIX_SOCKET_FLAG ? recv(client_socket, received_buffer, buffer_size, 0) : recvfrom(client_socket, received_buffer, buffer_size, 0, address, client_addr_len)) > 0) { send_buffer(client_socket, received_buffer, buffer_size); } @@ -136,7 +145,7 @@ void controlc_handler() exit(SYSTEM_EXIT_SUCCESS); } -void server_listen(int client_socket, int server_socket, socket_address client_address, socklen_t client_addr_len, int buffer_size) +void server_listen(int client_socket, int server_socket, int buffer_size) { if (listen(server_socket, MAX_CONNECTIONS) == SOCKET_ERROR_CODE) @@ -147,8 +156,8 @@ void server_listen(int client_socket, int server_socket, socket_address client_a } printf("[SERVER] - Server TCP listening on port %d...\n", SERVER_PORT); - - client_socket = accept_connection(client_socket, server_socket, client_address, client_addr_len); + + client_socket = accept_connection(client_socket, server_socket); receive_buffer(client_socket, buffer_size); } @@ -159,13 +168,13 @@ void attribuite_socket_type(int socket_type) case TCP_SOCKET_FLAG: // TCP SOCKET sin_family = AF_INET; - address = inet_addr(HOST_IP); + address = HOST_IP; sock = SOCK_STREAM; break; case UDP_SOCKET_FLAG: // UDP SOCKET - address = INADDR_ANY; + address = HOST_IP; sock = SOCK_DGRAM; break; @@ -209,14 +218,11 @@ int main(int argc, char** argv) server_socket = create_socket(); - socket_address server_address; - client_addr_len = sizeof(client_address); + config_server_address(); - server_address = config_server_address(); - - bind_server(server_socket, server_address); + bind_server(server_socket); - server_listen(client_socket, server_socket, client_address, client_addr_len, buffer_size); + server_listen(client_socket, server_socket, buffer_size); return SYSTEM_EXIT_SUCCESS; } From 7b6c4e7e1ee5ba98adecd41e3b3650f6fc87c943 Mon Sep 17 00:00:00 2001 From: Vinicius Silva Date: Mon, 11 Dec 2023 15:09:27 -0300 Subject: [PATCH 8/8] Problems about socket executions fixed --- .gitignore | 2 ++ .vscode/settings.json | 13 ------------- bin/client | Bin 17496 -> 17536 bytes bin/server | Bin 17536 -> 17496 bytes data/time_file1 | 3 --- dependences.dot | 27 --------------------------- dependences.png | Bin 46098 -> 0 bytes src/client.c | 40 +++++++++++++++++----------------------- src/server.c | 24 ++++++++++-------------- 9 files changed, 29 insertions(+), 80 deletions(-) delete mode 100644 .vscode/settings.json delete mode 100644 data/time_file1 delete mode 100644 dependences.dot delete mode 100644 dependences.png diff --git a/.gitignore b/.gitignore index 42dea9d..6f8b904 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # Prerequisites *.d +*.vscode/settings.json +.vscode/settings.json # Object files *.o *.ko diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 88a1184..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "files.associations": { - "unistd.h": "c", - "stdio.h": "c", - "in.h": "c", - "time.h": "c", - "signal.h": "c", - "string.h": "c", - "stdlib.h": "c", - "inet.h": "c", - "un.h": "c" - } -} \ No newline at end of file diff --git a/bin/client b/bin/client index d3458fc5eeb0022de847fc7bf20a2cae64ef8a23..6454ae72ad49bd74bd89d61b3c75610f45331179 100755 GIT binary patch delta 4058 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 delta 4629 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 diff --git a/data/time_file1 b/data/time_file1 deleted file mode 100644 index e5b7482..0000000 --- a/data/time_file1 +++ /dev/null @@ -1,3 +0,0 @@ -make[1]: Entrando no diretório '/home/silva/pingpong' -0.000912 -make[1]: Saindo do diretório '/home/silva/pingpong' diff --git a/dependences.dot b/dependences.dot deleted file mode 100644 index ff31cd4..0000000 --- a/dependences.dot +++ /dev/null @@ -1,27 +0,0 @@ -digraph "pingpong" { -node [ - fontsize = "12" -]; -subgraph clusterLegend { - label = "Legend"; - color = black; - edge [ style = invis ]; - legendNode0 [ label = "Executable", shape = egg ]; - legendNode1 [ label = "Static Library", shape = octagon ]; - legendNode2 [ label = "Shared Library", shape = doubleoctagon ]; - legendNode3 [ label = "Module Library", shape = tripleoctagon ]; - legendNode4 [ label = "Interface Library", shape = pentagon ]; - legendNode5 [ label = "Object Library", shape = hexagon ]; - legendNode6 [ label = "Unknown Library", shape = septagon ]; - legendNode7 [ label = "Custom Target", shape = box ]; - legendNode0 -> legendNode1 [ style = solid ]; - legendNode0 -> legendNode2 [ style = solid ]; - legendNode0 -> legendNode3; - legendNode1 -> legendNode4 [ label = "Interface", style = dashed ]; - legendNode2 -> legendNode5 [ label = "Private", style = dotted ]; - legendNode3 -> legendNode6 [ style = solid ]; - legendNode0 -> legendNode7; -} - "node0" [ label = "./bin/client", shape = egg ]; - "node1" [ label = "./bin/server", shape = egg ]; -} diff --git a/dependences.png b/dependences.png deleted file mode 100644 index 72ffa9d0c78fa85498e20e203e60a6ccfcf27012..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46098 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 W-=3Tq7W+oQAHy+b261{bH~tT}V6+kd diff --git a/src/client.c b/src/client.c index 861e2d1..c9eff84 100644 --- a/src/client.c +++ b/src/client.c @@ -59,7 +59,7 @@ void panic(char* message) int init_socket() { - int client_socket = socket(sin_family, sock, IPPROTO_TCP); + int client_socket = socket(sin_family, sock, -1); if(client_socket == SOCKET_ERROR_CODE) { @@ -116,28 +116,18 @@ int receive_buffer(int client_socket, int buffer_size) socklen_t* server_addr_size = socket_type == UNIX_SOCKET_FLAG ? (socklen_t*)sizeof(server_address.socket_unix) : (socklen_t*)sizeof(server_address.socket_ipv4); recvfrom(client_socket, received_buffer, buffer_size, 0, address, server_addr_size); } - - for(int i = 0; i < buffer_size; i++) - { - printf("%d", received_buffer[i]); - } - printf("\nRECEBIDO\n"); } -void send_buffer(int client_socket, int buffer[], size_t buffer_size) +void send_buffer(int client_socket, int* buffer, size_t buffer_size) { - for(int i = 0; i < num_of_read_bytes; i++) - { - printf("ENVIO %d\n", i); + + struct sockaddr* address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&server_address.socket_unix : (struct sockaddr*)&server_address.socket_ipv4; + socklen_t server_addr_size = socket_type == UNIX_SOCKET_FLAG ? (socklen_t)sizeof(server_address.socket_unix) : (socklen_t)sizeof(server_address.socket_ipv4); - struct sockaddr* address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&server_address.socket_unix : (struct sockaddr*)&server_address.socket_ipv4; - socklen_t server_addr_size = socket_type == UNIX_SOCKET_FLAG ? (socklen_t)sizeof(server_address.socket_unix) : (socklen_t)sizeof(server_address.socket_ipv4); + if(socket_type == TCP_SOCKET_FLAG) send(client_socket, buffer, buffer_size, 0); + else sendto(client_socket, buffer, buffer_size, 0, address, server_addr_size); - if(socket_type == TCP_SOCKET_FLAG) send(client_socket, buffer, buffer_size, 0); - else sendto(client_socket, buffer, buffer_size, 0, address, server_addr_size); - - receive_buffer(client_socket, buffer_size); - } + receive_buffer(client_socket, buffer_size); } void controlc_handler() @@ -146,7 +136,7 @@ void controlc_handler() exit(SYSTEM_EXIT_SUCCESS); } -void socket_listen(int client_socket, int buffer[], size_t buffer_size) +void socket_listen(int client_socket, int* buffer, size_t buffer_size) { if(signal(SIGINT, controlc_handler) == SIG_ERR) @@ -216,8 +206,9 @@ int main(int argc, char** argv) get_args(argc, argv); attribuite_socket_type(socket_type); - int buffer[buffer_size]; + int* buffer = (int*)malloc(buffer_size*sizeof(int)); + for(int i = 0; i < buffer_size; i++) { buffer[i] = (int)(i % 255); @@ -229,9 +220,12 @@ int main(int argc, char** argv) connect_to_server(client_socket); - socket_listen(client_socket, buffer, buffer_size); + for(int i = 0; i < num_of_read_bytes; i++) + { + socket_listen(client_socket, buffer, buffer_size); + + printf("%lf\n", (float)(elapsed_time_ms)); + } - printf("%lf\n", (float)(elapsed_time_ms)); - return SYSTEM_EXIT_SUCCESS; } diff --git a/src/server.c b/src/server.c index 55d597a..63c27b6 100644 --- a/src/server.c +++ b/src/server.c @@ -53,7 +53,7 @@ int create_socket() { int server_socket; - server_socket = socket(sin_family, sock, IPPROTO_TCP); + server_socket = socket(sin_family, sock, -1); if(server_socket == SOCKET_ERROR_CODE) { @@ -112,7 +112,7 @@ int accept_connection(int client_socket, int server_socket) } } -void send_buffer(int client_socket, int buffer[], int buffer_size) +void send_buffer(int client_socket, int* buffer, int buffer_size) { socklen_t client_addr_len = socket_type == UNIX_SOCKET_FLAG ? sizeof(client_address.socket_ipv4) : sizeof(client_address.socket_unix); struct sockaddr *address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&client_address.socket_unix : (struct sockaddr*)&client_address.socket_ipv4; @@ -129,19 +129,14 @@ int receive_buffer(int client_socket, int buffer_size) struct sockaddr *address = socket_type == UNIX_SOCKET_FLAG ? (struct sockaddr*)&client_address.socket_unix : (struct sockaddr*)&client_address.socket_ipv4; int received_buffer[buffer_size]; - for(int i = 0; i < num_of_read_bytes; i++) + while((bytes_read = socket_type == UNIX_SOCKET_FLAG ? recv(client_socket, received_buffer, buffer_size, 0) : recvfrom(client_socket, received_buffer, buffer_size, 0, address, client_addr_len)) > 0) { - - while((bytes_read = socket_type == UNIX_SOCKET_FLAG ? recv(client_socket, received_buffer, buffer_size, 0) : recvfrom(client_socket, received_buffer, buffer_size, 0, address, client_addr_len)) > 0) - { - send_buffer(client_socket, received_buffer, buffer_size); - } + send_buffer(client_socket, received_buffer, buffer_size); } } void controlc_handler() { - printf("\nProgram finished!\n"); exit(SYSTEM_EXIT_SUCCESS); } @@ -154,8 +149,6 @@ void server_listen(int client_socket, int server_socket, int buffer_size) close(server_socket); panic("Listening mode error"); } - - printf("[SERVER] - Server TCP listening on port %d...\n", SERVER_PORT); client_socket = accept_connection(client_socket, server_socket); receive_buffer(client_socket, buffer_size); @@ -212,8 +205,8 @@ int main(int argc, char** argv) get_args(argc, argv); attribuite_socket_type(socket_type); - int buffer[buffer_size]; - + int* buffer = (int*)malloc(buffer_size*sizeof(int)); + int server_socket, client_socket; server_socket = create_socket(); @@ -222,7 +215,10 @@ int main(int argc, char** argv) bind_server(server_socket); - server_listen(client_socket, server_socket, buffer_size); + for(int i = 0; i < num_of_read_bytes; i++) + { + server_listen(client_socket, server_socket, buffer_size); + } return SYSTEM_EXIT_SUCCESS; }