diff --git a/include/pipe.h b/include/pipe.h new file mode 100644 index 0000000..b929081 --- /dev/null +++ b/include/pipe.h @@ -0,0 +1,15 @@ +#ifndef __PIPE_H__ + + #define PIPE_ERROR_CODE -1 + #define PROCESS_ERROR_CODE -1 + #define NUM_OF_PIPE_DESCRIPTORS 2 + #define CHILD_PROCESS 0 + + 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); +#endif // __PIPE_H__ \ No newline at end of file diff --git a/include/socket.h b/include/socket.h index 19a208c..a12e954 100644 --- a/include/socket.h +++ b/include/socket.h @@ -2,15 +2,16 @@ #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 HOST_IP "127.0.0.1" // IPV4 loopback address - #define SERVER_PORT 8481 // Server port - #define UNIXDOAMIN_ADDRESS "pingpong.socket" + #define HOST_IP "127.0.0.1" // IPV4 loopback address + #define SERVER_PORT 8481 // Server port + #define UNIXDOAMIN_ADDRESS "pingpong.socket" #define MAX_CONNECTIONS 1 // Num max client connected simultaneously - #define NUM_OF_ARGUMENTS 3 - #define TCP_SOCKET_FLAG 1 - #define UDP_SOCKET_FLAG 2 - #define UNIX_SOCKET_FLAG 3 + #define NUM_OF_ARGUMENTS 3 + #define TCP_SOCKET_FLAG 1 + #define UDP_SOCKET_FLAG 2 + #define UNIX_SOCKET_FLAG 3 + #define PIPE_CONNECTION_FLAG 4 typedef struct sockaddr_in socket_address_ipv4; typedef struct sockaddr_un socket_address_unix; diff --git a/src/main_client.c b/src/main_client.c index c496830..816a42b 100644 --- a/src/main_client.c +++ b/src/main_client.c @@ -1,4 +1,5 @@ #include "../include/socket.h" +#include "../include/pipe.h" #include "../include/utils.h" #define N 10000 @@ -12,6 +13,9 @@ int* buffer; size_t buffer_size; int socket_type; +pid_t child; +int *descriptors; + socket_address_ipv4 ipv4_server_address; socket_address_unix unix_server_address; @@ -86,13 +90,23 @@ void attribuite_and_init_socket(int socket_type) connect_to_server((void*)&unix_server_address,client_socket); break; + + case PIPE_CONNECTION_FLAG: // PIPE CONNECTION FLAG + descriptors = create_pipe(); + child = fork_process(); + + server_read_pipe(descriptors, child, buffer_size, buffer); + + break; + default: panic("Value error!"); break; } } + void get_args(int argc, char** argv) { if(argc > NUM_OF_ARGUMENTS) diff --git a/src/main_server.c b/src/main_server.c index c0bebee..0dd150d 100644 --- a/src/main_server.c +++ b/src/main_server.c @@ -1,16 +1,20 @@ #include "../include/socket.h" +#include "../include/pipe.h" #include "../include/utils.h" - int num_of_read_bytes = 0; socklen_t client_addr_len; +int *descriptors; +pid_t child; + int server_socket, client_socket; socket_address client_address, server_address; +int *buffer; size_t buffer_size; int socket_type; @@ -79,7 +83,14 @@ void attribuite_socket_type(int socket_type) server_socket = create_socket(AF_UNIX, SOCK_DGRAM); config_unixdomain_server_address(); break; + + case PIPE_CONNECTION_FLAG: // PIPE CONNECTION FLAG + descriptors = create_pipe(); + child = fork_process(); + + break; + default: panic("Value error!"); break; @@ -106,7 +117,7 @@ int main(int argc, char** argv) get_args(argc, argv); attribuite_socket_type(socket_type); - int* buffer = (int*)malloc(buffer_size*sizeof(int)); + buffer = (int*)malloc(buffer_size*sizeof(int)); bind_server((void*)&server_address, socket_type, server_socket); diff --git a/src/pipe.c b/src/pipe.c new file mode 100644 index 0000000..5b928c0 --- /dev/null +++ b/src/pipe.c @@ -0,0 +1,78 @@ +#include +#include + +#include "../include/pipe.h" +#include "../include/utils.h" + + +int *create_pipe() +{ + int pipe_descriptors[NUM_OF_PIPE_DESCRIPTORS]; + + if(pipe(pipe_descriptors) == PIPE_ERROR_CODE) + { + panic("Pipe creation failed"); + } + + return &pipe_descriptors[0]; +} + +pid_t fork_process() +{ + pid_t child_pid; + + if((child_pid == fork()) == PROCESS_ERROR_CODE) + { + panic("Fork failed"); + } + + return child_pid; +} + +void client_write_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]); + + read(descriptors[0], buffer, sizeof(buffer)); + close(descriptors[0]); + }else + { + server_write_pipe(descriptors, child, buffer_size, buffer); + } +} + + +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