From 9ced8b783b8daa15635c0c45181c300a3be54b93 Mon Sep 17 00:00:00 2001 From: Vinicius Date: Wed, 29 Nov 2023 12:38:28 -0300 Subject: [PATCH] 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;