Basic pipe connection implemented

This commit is contained in:
Vinicius 2023-12-17 23:56:48 -03:00
parent cafe400c4e
commit a57ae65695
5 changed files with 128 additions and 9 deletions

15
include/pipe.h Normal file
View File

@ -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__

View File

@ -2,15 +2,16 @@
#define SOCKET_ERROR_CODE -1 // Socket create, Connection server, Receive buffer to server code error #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_FAILED 1 // Operating System program error response
#define HOST_IP "127.0.0.1" // IPV4 loopback address #define HOST_IP "127.0.0.1" // IPV4 loopback address
#define SERVER_PORT 8481 // Server port #define SERVER_PORT 8481 // Server port
#define UNIXDOAMIN_ADDRESS "pingpong.socket" #define UNIXDOAMIN_ADDRESS "pingpong.socket"
#define MAX_CONNECTIONS 1 // Num max client connected simultaneously #define MAX_CONNECTIONS 1 // Num max client connected simultaneously
#define NUM_OF_ARGUMENTS 3 #define NUM_OF_ARGUMENTS 3
#define TCP_SOCKET_FLAG 1 #define TCP_SOCKET_FLAG 1
#define UDP_SOCKET_FLAG 2 #define UDP_SOCKET_FLAG 2
#define UNIX_SOCKET_FLAG 3 #define UNIX_SOCKET_FLAG 3
#define PIPE_CONNECTION_FLAG 4
typedef struct sockaddr_in socket_address_ipv4; typedef struct sockaddr_in socket_address_ipv4;
typedef struct sockaddr_un socket_address_unix; typedef struct sockaddr_un socket_address_unix;

View File

@ -1,4 +1,5 @@
#include "../include/socket.h" #include "../include/socket.h"
#include "../include/pipe.h"
#include "../include/utils.h" #include "../include/utils.h"
#define N 10000 #define N 10000
@ -12,6 +13,9 @@ int* buffer;
size_t buffer_size; size_t buffer_size;
int socket_type; int socket_type;
pid_t child;
int *descriptors;
socket_address_ipv4 ipv4_server_address; socket_address_ipv4 ipv4_server_address;
socket_address_unix unix_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); connect_to_server((void*)&unix_server_address,client_socket);
break; break;
case PIPE_CONNECTION_FLAG: // PIPE CONNECTION FLAG
descriptors = create_pipe();
child = fork_process();
server_read_pipe(descriptors, child, buffer_size, buffer);
break;
default: default:
panic("Value error!"); panic("Value error!");
break; break;
} }
} }
void get_args(int argc, char** argv) void get_args(int argc, char** argv)
{ {
if(argc > NUM_OF_ARGUMENTS) if(argc > NUM_OF_ARGUMENTS)

View File

@ -1,16 +1,20 @@
#include "../include/socket.h" #include "../include/socket.h"
#include "../include/pipe.h"
#include "../include/utils.h" #include "../include/utils.h"
int num_of_read_bytes = 0; int num_of_read_bytes = 0;
socklen_t client_addr_len; socklen_t client_addr_len;
int *descriptors;
pid_t child;
int server_socket, client_socket; int server_socket, client_socket;
socket_address client_address, server_address; socket_address client_address, server_address;
int *buffer;
size_t buffer_size; size_t buffer_size;
int socket_type; int socket_type;
@ -79,7 +83,14 @@ void attribuite_socket_type(int socket_type)
server_socket = create_socket(AF_UNIX, SOCK_DGRAM); server_socket = create_socket(AF_UNIX, SOCK_DGRAM);
config_unixdomain_server_address(); config_unixdomain_server_address();
break; break;
case PIPE_CONNECTION_FLAG: // PIPE CONNECTION FLAG
descriptors = create_pipe();
child = fork_process();
break;
default: default:
panic("Value error!"); panic("Value error!");
break; break;
@ -106,7 +117,7 @@ int main(int argc, char** argv)
get_args(argc, argv); get_args(argc, argv);
attribuite_socket_type(socket_type); 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); bind_server((void*)&server_address, socket_type, server_socket);

78
src/pipe.c Normal file
View File

@ -0,0 +1,78 @@
#include <stdlib.h>
#include <unistd.h>
#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]);
}