====== network ======
This module provides a generic ''%%Server%%'' type that abstracts away the setup and teardown of a socket
===== Enums =====
==== ServerType ====
Types of servers. Currently supports TCP and UDP, will eventually add UNIX sockets.
typedef enum ServerType {
SERVERTYPE_TCP,
SERVERTYPE_UDP
} ServerType;
===== Structs =====
==== Server ====
Server is a generic abstraction over sockets. The type of the server is defined by ''%%server_type%%''.
typedef struct Server {
ServerType server_type;
int fd;
int port;
void (*handler)(struct Server *s);
} Server;
===== Functions =====
==== new_server ====
Create a ''%%Server*%%''. User is responsible for freeing the memory.
Server *new_server(ServerType type, const char *port, void(handler)(Server *s));
==== delete_server ====
Frees the memory allocated for ''%%Server*%%'' and sets the pointer to ''%%NULL%%''.
void delete_server(Server *s);
==== serve ====
Starts up the server. ''%%backlog_size%%'' is the size of the backlog buffer for the underlying socket. Use the macro ''%%DEFAULT_BACKLOG_SIZE%%'' or pass ''%%0%%'' to use a reasonable default.
int serve(Server *s, int backlog_size);
==== get_in_addr ====
Convenience method to get an IP address from a ''%%struct sockaddr_storage%%'' of either IPV4 or IPV6.
void *get_in_addr(struct sockaddr *sa);
/* Usage */
struct sockaddr_storage client_addr;
socklen_t client_addr_sz = sizeof(client_addr);
char buf[33];
if (new_fd = accept(s->fd, (struct sockaddr *)&client_addr, &client_addr_sz) == -1) {
/* error handling */
}
inet_ntop(client_addr.ss_family, get_in_addr((struct sockaddr *)&client_addr), buf, 32);
printf("Received connection from %s\n", buf);
==== handler_tcp_echo ====
An example handler for a multithreaded tcp echo server.
void handler_tcp_echo(Server *s);
/* Usage */
#include "lfnetwork.h"
int main(int argc, char **argv) {
Server *server = new_server(SERVERTYPE_TCP, "80", handler_tcp_echo);
serve(server, DEFAULT_BACKLOG);
delete_server(server);
}
===== Macros =====
==== DEFAULT_BACKLOG_SIZE ====
A default size for the socket’s backlog buffer. ''%%5%%'' is a standard default size, providing some backlog but not enough to make huge buffers for each socket
#define DEFAULT_BACKLOG_SIZE 5