====== 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