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 0000000..5cb54e6 Binary files /dev/null and b/bin/client differ diff --git a/bin/server b/bin/server new file mode 100755 index 0000000..a270f93 Binary files /dev/null and b/bin/server differ diff --git a/dependences.dot b/dependences.dot new file mode 100644 index 0000000..ff31cd4 --- /dev/null +++ b/dependences.dot @@ -0,0 +1,27 @@ +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 new file mode 100644 index 0000000..72ffa9d Binary files /dev/null and b/dependences.png differ 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; }