If you want a better native version of the network stack for Linux, I can send it to you. I have a tested stack on epoll with 1k+ players.
[Hidden Content]
Epoll example version:
#define __LIBTHECORE__
#include "stdafx.h"
fdwatch *fdwatch_new() {
fdwatch *fdw;
CREATE(fdw, fdwatch, 1);
fdw->fd = epoll_create1(0);
if (fdw->fd == -1) {
sys_err("%s", strerror(errno));
return nullptr;
}
CREATE(fdw->events, epoll_event, 256);
return fdw;
}
void fdwatch_delete(fdwatch *fdw) {
close(fdw->fd);
free(fdw->events);
free(fdw);
}
int32_t fdwatch_count(fdwatch *fdw) {
int32_t num = epoll_wait(fdw->fd, fdw->events, 256, 0);
if (num == -1) {
fprintf(stderr, "%s\n", strerror(errno));
}
return num;
}
void fdwatch_add_fd(fdwatch *fdw, socket_t fd, void *client_data) {
TFDWatchData *data;
CREATE(data, TFDWatchData, 1);
data->client_data = client_data;
data->fd = fd;
epoll_event event{};
event.events = EPOLLIN | EPOLLOUT;
event.data.ptr = data;
if (epoll_ctl(fdw->fd, EPOLL_CTL_ADD, fd, &event)) {
fprintf(stderr, "%s\n", strerror(errno));
}
}
void fdwatch_del_fd(fdwatch *fdw, socket_t fd) {
epoll_ctl(fdw->fd, EPOLL_CTL_DEL, fd, nullptr);
}
int32_t fdwatch_check_event(fdwatch *fdw, socket_t fd, int32_t event_idx) {
auto *data = (TFDWatchData *) fdw->events[event_idx].data.ptr;
if (data->fd == fd) {
return fdw->events[event_idx].events;
} else {
return 0;
}
}
void *fdwatch_get_client_data(fdwatch *fdw, int32_t event_idx) {
auto *data = (TFDWatchData *) fdw->events[event_idx].data.ptr;
return data->client_data;
}
#ifndef __INC_LIBTHECORE_FDWATCH_H__
#define __INC_LIBTHECORE_FDWATCH_H__
#include <sys/epoll.h>
struct fdwatch {
socket_t fd;
epoll_event *events;
};
typedef struct FDWatchData {
socket_t fd;
void *client_data;
} TFDWatchData;
extern fdwatch *fdwatch_new();
extern void fdwatch_delete(fdwatch *fdw);
extern int32_t fdwatch_check_event(fdwatch *fdw, socket_t fd, int32_t event_idx);
extern void fdwatch_add_fd(fdwatch *fdw, socket_t fd, void *client_data);
extern int32_t fdwatch_count(fdwatch *fdw);
extern void *fdwatch_get_client_data(fdwatch *fdw, int32_t event_idx);
extern void fdwatch_del_fd(fdwatch *fdw, socket_t fd);
#endif