Basic pipe connection implemented
This commit is contained in:
parent
cafe400c4e
commit
a57ae65695
|
|
@ -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__
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
}
|
||||
Loading…
Reference in New Issue