diff --git a/CMakeLists.txt b/CMakeLists.txt index 63225d6..ed3c494 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,5 +5,13 @@ execute_process( COMMAND mkdir -p bin ) -add_executable(./bin/server ./include/socket.h ./include/utils.h ./src/socket.c ./src/utils.c ./src/main_server.c) -add_executable(./bin/client ./include/socket.h ./include/utils.h ./src/socket.c ./src/utils.c ./src/main_client.c) +set(SOURCE_FILES + src/socket.c + src/pipe.c + src/utils.c +) + +include_directories(include) + +add_executable(./bin/server ${SOURCE_FILES} ./src/main_server.c) +add_executable(./bin/client ${SOURCE_FILES} ./src/main_client.c) diff --git a/bin/client b/bin/client new file mode 100755 index 0000000..dea2ffe Binary files /dev/null and b/bin/client differ diff --git a/bin/server b/bin/server new file mode 100755 index 0000000..56da69a Binary files /dev/null and b/bin/server differ diff --git a/include/pipe.h b/include/pipe.h index b929081..c4a04b4 100644 --- a/include/pipe.h +++ b/include/pipe.h @@ -5,11 +5,10 @@ #define NUM_OF_PIPE_DESCRIPTORS 2 #define CHILD_PROCESS 0 + #include + extern int *create_pipe(); extern pid_t fork_process(); - - extern void server_write_pipe(int* descriptors, pid_t child, int buffer_size, int *buffer); - extern void server_read_pipe( int* descriptors, pid_t child, int buffer_size, int *buffer); - extern void client_read_pipe( int* descriptors, pid_t child, int buffer_size, int *buffer); - extern void client_write_pipe(int* descriptors, pid_t child, int buffer_size, int *buffer); + + extern float pingpong_pipe(int* descriptors, pid_t child, int buffer_size, int *buffer); #endif // __PIPE_H__ \ No newline at end of file diff --git a/src/main_client.c b/src/main_client.c index 816a42b..cc79aac 100644 --- a/src/main_client.c +++ b/src/main_client.c @@ -42,8 +42,7 @@ void send_buffer(void *server_address) 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(socket_type == UNIX_SOCKET_FLAG ? (void*)&unix_server_address : (void*)&ipv4_server_address); + receive_buffer(server_address); } void controlc_handler() @@ -96,8 +95,6 @@ void attribuite_and_init_socket(int socket_type) descriptors = create_pipe(); child = fork_process(); - server_read_pipe(descriptors, child, buffer_size, buffer); - break; default: @@ -128,12 +125,16 @@ int main(int argc, char** argv) buffer = get_init_buffer(buffer_size); + float sum_elapsed_time_ms = 0.0; + for(int i = 0; i < num_of_read_bytes; i++) { - socket_listen(); + socket_type == PIPE_CONNECTION_FLAG ? elapsed_time_ms = pingpong_pipe(descriptors, child, buffer_size, buffer) : socket_listen(); - printf("%lf\n", (float)(elapsed_time_ms)); + sum_elapsed_time_ms += elapsed_time_ms; } + printf("%lf\n", (float)((sum_elapsed_time_ms)/(num_of_read_bytes))); + return SYSTEM_EXIT_SUCCESS; } diff --git a/src/main_server.c b/src/main_server.c index 0dd150d..411534c 100644 --- a/src/main_server.c +++ b/src/main_server.c @@ -12,7 +12,9 @@ pid_t child; int server_socket, client_socket; -socket_address client_address, server_address; +socket_address client_address; + +void* server_address; int *buffer; size_t buffer_size; @@ -69,19 +71,22 @@ void attribuite_socket_type(int socket_type) { case TCP_SOCKET_FLAG: // TCP SOCKET - server_socket = create_socket(AF_INET, SOCK_STREAM); - config_tcp_upd_server_address(); + server_socket = create_socket(AF_INET, SOCK_STREAM); + socket_address_ipv4 udp_ip_address = config_tcp_upd_server_address(); + server_address = (void *)&udp_ip_address; break; case UDP_SOCKET_FLAG: // UDP SOCKET - server_socket = create_socket(AF_INET, SOCK_DGRAM); - config_tcp_upd_server_address(); + server_socket = create_socket(AF_INET, SOCK_DGRAM); + socket_address_ipv4 tcp_ip_address = config_tcp_upd_server_address(); + server_address = (void *)&tcp_ip_address; break; case UNIX_SOCKET_FLAG: // UNIXDOMAIN SOCKET - server_socket = create_socket(AF_UNIX, SOCK_DGRAM); - config_unixdomain_server_address(); + server_socket = create_socket(AF_UNIX, SOCK_DGRAM); + socket_address_unix unix_address = config_unixdomain_server_address(); + server_address = (void *)&unix_address; break; case PIPE_CONNECTION_FLAG: // PIPE CONNECTION FLAG @@ -114,17 +119,20 @@ void get_args(int argc, char** argv) int main(int argc, char** argv) { + printf("OI0"); get_args(argc, argv); + printf("OI1"); attribuite_socket_type(socket_type); buffer = (int*)malloc(buffer_size*sizeof(int)); - - bind_server((void*)&server_address, socket_type, server_socket); - + printf("OI2"); + //bind_server(server_address, socket_type, server_socket); + printf("OI3"); for(int i = 0; i < num_of_read_bytes; i++) { server_listen(); } + printf("OI4"); return SYSTEM_EXIT_SUCCESS; } diff --git a/src/pipe.c b/src/pipe.c index 5b928c0..8f19606 100644 --- a/src/pipe.c +++ b/src/pipe.c @@ -7,14 +7,14 @@ int *create_pipe() { - int pipe_descriptors[NUM_OF_PIPE_DESCRIPTORS]; + int *pipe_descriptors = (int*)malloc(NUM_OF_PIPE_DESCRIPTORS*sizeof(int)); if(pipe(pipe_descriptors) == PIPE_ERROR_CODE) { panic("Pipe creation failed"); } - return &pipe_descriptors[0]; + return pipe_descriptors; } pid_t fork_process() @@ -29,50 +29,43 @@ pid_t fork_process() return child_pid; } -void client_write_pipe(int* descriptors, pid_t child, int buffer_size, int *buffer) +float pingpong_pipe(int* descriptors, pid_t child, int buffer_size, int *buffer) { - close(descriptors[0]); - write(descriptors[1], buffer, sizeof(descriptors)); - close(descriptors[1]); -} -void client_read_pipe(int* descriptors, pid_t child, int buffer_size, int *buffer) -{ - if (child == CHILD_PROCESS) { - close(descriptors[1]); + int *pipe_client_to_server = create_pipe(); + int *pipe_server_to_client = create_pipe(); + + if (child == CHILD_PROCESS) + { + close(pipe_client_to_server[1]); + close(pipe_server_to_client[0]); + + ssize_t bytes_read; + clock_t start_time = clock(); + bytes_read = read(pipe_client_to_server[0], buffer, sizeof(buffer)); + + write(pipe_server_to_client[1], buffer, bytes_read); + clock_t end_time = clock(); + + close(pipe_client_to_server[0]); + close(pipe_server_to_client[1]); + + return ((float)(end_time - start_time) / (CLOCKS_PER_SEC/1000)); + }else + { + close(pipe_client_to_server[0]); + close(pipe_server_to_client[1]); + + clock_t start_time = clock(); + write(pipe_client_to_server[1], buffer, sizeof(buffer)); - read(descriptors[0], buffer, sizeof(buffer)); - close(descriptors[0]); - }else - { - server_write_pipe(descriptors, child, buffer_size, buffer); + ssize_t bytes_read = read(pipe_server_to_client[0], buffer, sizeof(buffer)); + clock_t end_time = clock(); + + + close(pipe_client_to_server[1]); + close(pipe_server_to_client[0]); + + return ((float)(end_time - start_time) / (CLOCKS_PER_SEC/1000)); } -} - - -void server_read_pipe(int* descriptors, pid_t child, int buffer_size, int *buffer) -{ - - int* received_buffer = (int*)malloc(buffer_size*sizeof(int)); - - if (child == CHILD_PROCESS) - { - close(descriptors[1]); - - read(descriptors[0], received_buffer, sizeof(buffer)); - - close(descriptors[0]); - exit(EXIT_SUCCESS); - }else - { - client_write_pipe(descriptors, child, buffer_size, buffer); - } -} - - -void server_write_pipe(int* descriptors, pid_t child, int buffer_size, int *buffer) -{ - close(descriptors[0]); - write(descriptors[1], buffer, sizeof(buffer)); - close(descriptors[1]); } \ No newline at end of file diff --git a/src/socket.c b/src/socket.c index 5c9c3f9..8194e01 100644 --- a/src/socket.c +++ b/src/socket.c @@ -14,7 +14,7 @@ int create_socket(int sin_family, int sock) { int server_socket; - server_socket = socket(sin_family, sock, -1); + server_socket = socket(sin_family, sock, 0); if(server_socket == SOCKET_ERROR_CODE) { @@ -45,11 +45,13 @@ socket_address_ipv4 config_tcp_upd_server_address() void connect_to_server(void *server_address, int client_socket) { - struct sockaddr* address = (struct sockaddr*)&server_address; + socket_address_ipv4 server = config_tcp_upd_server_address(); + + struct sockaddr* address = (struct sockaddr*)&server; int connection_response = connect(client_socket, address, - (socklen_t)sizeof(server_address) + (socklen_t)sizeof(server) ); if(connection_response == SOCKET_ERROR_CODE) @@ -64,9 +66,10 @@ void connect_to_server(void *server_address, int client_socket) void bind_server(void *server_address, int socket_type, int server_socket) { - struct sockaddr* address = (struct sockaddr*)&server_address; + socket_address_ipv4 server = config_tcp_upd_server_address(); + struct sockaddr* address = (struct sockaddr*)&server; - int server_bind_response = bind(server_socket, address, sizeof(server_address)); + int server_bind_response = bind(server_socket, address, sizeof(server)); if (socket_type == UNIX_SOCKET_FLAG) unlink((const char*)address);