Socket TCP, UDP and UNIXDOMAIN connetions implemented
This commit is contained in:
parent
570aa73f56
commit
0e6ef7dc8a
|
|
@ -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)
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -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 ];
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
145
src/client.c
145
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;
|
||||
}
|
||||
|
|
|
|||
129
src/server.c
129
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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue