update stuffs
This commit is contained in:
71
chatserver.c
71
chatserver.c
@@ -7,26 +7,7 @@
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
static void sockaddr2str(const struct sockaddr *sa, char *s, const size_t maxlen) {
|
||||
if (sa->sa_family == AF_INET) {
|
||||
const struct sockaddr_in *sin = (struct sockaddr_in *)sa;
|
||||
inet_ntop(AF_INET, &sin->sin_addr, s, maxlen);
|
||||
const size_t len = strnlen(s, maxlen);
|
||||
snprintf(s + len, maxlen - len, ":%u", ntohs(sin->sin_port));
|
||||
return;
|
||||
}
|
||||
|
||||
if (sa->sa_family == AF_INET6) {
|
||||
const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
|
||||
s[0] = '[';
|
||||
inet_ntop(AF_INET6, &sin6->sin6_addr, s + 1, maxlen - 1);
|
||||
const size_t len = strnlen(s, maxlen);
|
||||
snprintf(s + len, maxlen - len, "]:%u", ntohs(sin6->sin6_port));
|
||||
return;
|
||||
}
|
||||
|
||||
strncpy(s, "unknown", maxlen);
|
||||
}
|
||||
#include "shared.h"
|
||||
|
||||
#define MAX_CLIENTS 100
|
||||
#define BUFFER_SIZE 1024
|
||||
@@ -56,6 +37,29 @@ typedef struct {
|
||||
fflush(stdout); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
const char* ansi_colors[] = {
|
||||
"\033[30m", "\033[31m", "\033[32m", "\033[33m", "\033[34m", "\033[35m", "\033[36m", "\033[37m",
|
||||
"\033[90m", "\033[91m", "\033[92m", "\033[93m", "\033[94m", "\033[95m", "\033[96m", "\033[97m",
|
||||
"\033[0m"
|
||||
};
|
||||
|
||||
static unsigned long djb2(const unsigned char *str, size_t size) {
|
||||
unsigned long hash = 5381;
|
||||
while (size--) hash = ((hash << 5) + hash) + *str++;
|
||||
return hash;
|
||||
}
|
||||
|
||||
const char* sockaddr_color(const struct sockaddr *addr) {
|
||||
if (addr->sa_family == AF_INET) {
|
||||
return ansi_colors[djb2((const unsigned char*)&((const struct sockaddr_in*)&addr)->sin_addr, 4) % 16];
|
||||
}
|
||||
if (addr->sa_family == AF_INET6) {
|
||||
return ansi_colors[djb2((const unsigned char*)&((const struct sockaddr_in6*)&addr)->sin6_addr, 16) % 16];
|
||||
}
|
||||
return ansi_colors[16];
|
||||
}*/
|
||||
|
||||
void* handle_client(void* _arg) {
|
||||
const pthread_input_t* arg = _arg;
|
||||
const int client_fd = arg->sock;
|
||||
@@ -63,20 +67,20 @@ void* handle_client(void* _arg) {
|
||||
free(_arg);
|
||||
|
||||
char message[BUFFER_SIZE];
|
||||
|
||||
|
||||
FILE* reader = fdopen(client_fd, "r");
|
||||
|
||||
|
||||
if (reader == NULL) {
|
||||
perror("fdopen");
|
||||
close(client_fd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
while (fgets(message, BUFFER_SIZE, reader) != NULL) {
|
||||
message[strcspn(message, "\n")] = 0;
|
||||
if (message[0] == '\0') continue;
|
||||
|
||||
char client_ip[INET6_ADDRSTRLEN + 8];
|
||||
|
||||
char client_ip[CC_ADDRLEN];
|
||||
sockaddr2str((struct sockaddr*)&addr, client_ip, sizeof(client_ip));
|
||||
tell_everyone("%s: %s\n", client_ip, message);
|
||||
}
|
||||
@@ -89,23 +93,12 @@ void* handle_client(void* _arg) {
|
||||
break;
|
||||
}
|
||||
pthread_mutex_unlock(&clients.lock);
|
||||
char client_ip[INET6_ADDRSTRLEN + 8];
|
||||
char client_ip[CC_ADDRLEN];
|
||||
sockaddr2str((struct sockaddr*)&addr, client_ip, sizeof(client_ip));
|
||||
tell_everyone("- %s. total clients: %d\n", client_ip, clients.count);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define streq(a, b) (strcmp((a), (b)) == 0)
|
||||
#define exit_error(...) do { \
|
||||
fprintf(stderr, __VA_ARGS__); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} while (0)
|
||||
|
||||
#define exit_perror(s) do { \
|
||||
perror(s); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} while (0)
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
struct in6_addr bind_addr = in6addr_any;
|
||||
int port = 5000;
|
||||
@@ -165,8 +158,8 @@ int main(int argc, char* argv[]) {
|
||||
pthread_create(&thread, NULL, handle_client, pi);
|
||||
pthread_detach(thread);
|
||||
pthread_mutex_unlock(&clients.lock);
|
||||
char ip_buf[INET6_ADDRSTRLEN + 8];
|
||||
char ip_buf[CC_ADDRLEN];
|
||||
sockaddr2str((struct sockaddr*)&client_addr, ip_buf, sizeof(ip_buf));
|
||||
tell_everyone("+ %s. total clients: %d\n", ip_buf, clients.count);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user