Simple echo client

This commit is contained in:
2020-12-10 20:55:33 +01:00
parent 24ce5d8cd6
commit 42b8aee4bd
3 changed files with 81 additions and 38 deletions

View File

@ -7,12 +7,25 @@
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include "necronda-server.h"
#include "utils.h"
#include "net/http.h"
#define out_1(fmt) fprintf(parent_stdout, "%s" fmt "\n", log_base_prefix)
#define out_2(fmt, args...) fprintf(parent_stdout, "%s" fmt "\n", log_base_prefix, args)
#define out_x(x, arg1, arg2, arg3, arg4, arg5, arg6, arg7, FUNC, ...) FUNC
#define print(...) out_x(, ##__VA_ARGS__, out_2(__VA_ARGS__), out_2(__VA_ARGS__), out_2(__VA_ARGS__), \
out_2(__VA_ARGS__), out_2(__VA_ARGS__), out_2(__VA_ARGS__), out_1(__VA_ARGS__))
char *client_addr_str, *client_addr_str_ptr, *server_addr_str, *server_addr_str_ptr, *log_base_prefix, *log_req_prefix;
int client_websocket_handler() {
// TODO implement client_websocket_handler
return 0;
@ -23,32 +36,58 @@ int client_request_handler() {
return 0;
}
int client_connection_handler() {
// TODO implement client_connection_handler
int client_connection_handler(int client) {
char buf[256];
print("Connection accepted from %s (%s) [%s]", client_addr_str, client_addr_str, "N/A");
sprintf(buf, "Hello World!\nYour address is: %s\n", client_addr_str);
send(client, buf, strlen(buf), 0);
close(client);
print("Connection closed");
return 0;
}
pid_t client_handler(int socket) {
struct sockaddr_in client_addr;
int client_handler(int socket, long client_num) {
struct sockaddr_in6 client_addr, *server_addr;
struct sockaddr_storage server_addr_storage;
unsigned int client_addr_len = sizeof(client_addr);
char *color_table[] = {"\x1B[31m", "\x1B[32m", "\x1B[33m", "\x1B[34m", "\x1B[35m", "\x1B[36m"};
int client = accept(socket, (struct sockaddr *) &client_addr, &client_addr_len);
if (client == -1) {
fprintf(stderr, ERR_STR "Unable to accept connection: %s" CLR_STR "\n", strerror(errno));
fprintf(parent_stderr, ERR_STR "Unable to accept connection: %s" CLR_STR "\n", strerror(errno));
return -1;
}
pid_t pid = fork();
if (pid == 0) {
// child
recv(client, NULL, 0, 0);
char buf[] = "Hello world!\n";
send(client, buf, strlen(buf), 0);
close(client);
return 0;
client_addr_str_ptr = malloc(INET6_ADDRSTRLEN);
inet_ntop(client_addr.sin6_family, (void *) &client_addr.sin6_addr, client_addr_str_ptr, INET6_ADDRSTRLEN);
if (strncmp(client_addr_str_ptr, "::ffff:", 7) == 0) {
client_addr_str = client_addr_str_ptr + 7;
} else {
// parent
close(client);
return pid;
client_addr_str = client_addr_str_ptr;
}
socklen_t len = sizeof(server_addr_storage);
getsockname(client, (struct sockaddr *) &server_addr_storage, &len);
server_addr = (struct sockaddr_in6 *) &server_addr_storage;
server_addr_str_ptr = malloc(INET6_ADDRSTRLEN);
inet_ntop(server_addr->sin6_family, (void *) &server_addr->sin6_addr, server_addr_str_ptr, INET6_ADDRSTRLEN);
if (strncmp(server_addr_str_ptr, "::ffff:", 7) == 0) {
server_addr_str = server_addr_str_ptr + 7;
} else {
server_addr_str = server_addr_str_ptr;
}
log_base_prefix = malloc(256);
sprintf(log_base_prefix, "[%24s][%s%4i%s]%s[%*s][%5i]%s ",
server_addr_str, R_STR, ntohs(server_addr->sin6_port), CLR_STR,
color_table[client_num % 6], INET_ADDRSTRLEN, client_addr_str, ntohs(client_addr.sin6_port), CLR_STR);
int ret = client_connection_handler(client);
free(client_addr_str_ptr);
free(server_addr_str_ptr);
free(log_base_prefix);
return ret;
}