|
// Written by retoor@molodetz.nl
|
|
|
|
// This source code sets up a simple server using the rnet library to handle client connections. The server waits for client connections,
|
|
// reads data, and responds with simple HTTP headers. It closes the connection if a "GET" request is received.
|
|
|
|
// The non-standard import in this code is "rnet.h".
|
|
|
|
// MIT License
|
|
|
|
#include "rnet.h"
|
|
|
|
void on_client_connect(rnet_socket_t *sock) { printf("%s connected\n", sock->name); }
|
|
|
|
void on_client_read(rnet_socket_t *sock) {
|
|
unsigned char *data = net_socket_read(sock, 4096);
|
|
if (!data)
|
|
return;
|
|
|
|
const char *http_headers = "HTTP/1.1 200 OK\r\nContent-Length: 10\r\nConnection: close\r\n\r\n";
|
|
net_socket_write(sock, (unsigned char *)http_headers, strlen(http_headers));
|
|
|
|
rnet_safe_str((char *)data, sock->bytes_received);
|
|
printf("%s: %.30s\n", sock->name, data);
|
|
|
|
net_socket_write(sock, data, strlen((char *)data));
|
|
if (!strncmp((char *)data, "GET ", 4)) {
|
|
net_socket_close(sock);
|
|
}
|
|
}
|
|
|
|
void on_client_close(rnet_socket_t *sock) { printf("%s disconnected\n", sock->name); }
|
|
|
|
int main(int argc, char *argv[]) {
|
|
if (argc < 2) {
|
|
printf("Usage: [port].\n");
|
|
return 1;
|
|
}
|
|
|
|
for (int i = 0; i < argc; i++) {
|
|
if (strcmp(argv[i], "test") == 0) {
|
|
printf("Skipping rnet tests.\n");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
rnet_server_t *server = net_socket_serve((unsigned int)atoi(argv[1]), 10);
|
|
server->on_connect = on_client_connect;
|
|
server->on_read = on_client_read;
|
|
server->on_close = on_client_close;
|
|
|
|
while (true) {
|
|
if (net_socket_select(server)) {
|
|
printf("Handled all events.\n");
|
|
} else {
|
|
printf("No events to handle.\n");
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
} |