From: Laurent Mazet Date: Tue, 9 May 2023 11:55:07 +0000 (+0200) Subject: extract server code into separared file X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=00afbb6587ddad4cf6dde4a4e673c22ae50a8052;p=webserver.git extract server code into separared file --- diff --git a/server.c b/server.c new file mode 100644 index 0000000..0a50df1 --- /dev/null +++ b/server.c @@ -0,0 +1,104 @@ +/* depend: */ +/* cflags: */ +/* linker: color.o debug.o */ + +#include +#include +#include +#ifdef _WIN32 /* Windows */ +#include +#include +#else /* Posix */ +#include +#include +#include +#include +#include +//#include +//#include +#endif + +#include "debug.h" + +#include "server.h" + +/* types */ + +#ifdef _WIN32 /* Windows */ +typedef SOCKET socket_t; +#define PF_INET AF_INET +#define ERRNO (WSAGetLastError ()) +#else /* Posix */ +typedef int socket_t; +#define closesocket close +#define ERRNO errno +#define INVALID_SOCKET -1 +#define SOCKET_ERROR -1 +#endif + +/* constants */ + +#define BUFFER_SIZE 4096 + +/* macros */ + +/* gobal variables */ + +/* open listening socket */ + +socket_t open_listening_socket (int port) +{ +#ifdef _WIN32 /* Windows */ + WSADATA WSAData; + WSAStartup (MAKEWORD(2,0), &WSAData); + assert (INVALID_SOCKET == (socket_t)-1); + assert (SOCKET_ERROR == (socket_t)-1); +#endif + + VERBOSE (DEBUG, fprintf (stdout, "Opening socket\n")); + socket_t sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP); + if ((sock == INVALID_SOCKET) || (sock < 0)) + return -1; + + struct sockaddr_in addr = {0}; + addr.sin_family = PF_INET; + addr.sin_port = htons (port); + addr.sin_addr.s_addr = htonl (INADDR_ANY); + + VERBOSE (DEBUG, fprintf (stdout, "Binding socket\n")); + int rc = bind (sock, (struct sockaddr *)&addr, sizeof (addr)); + if ((rc == SOCKET_ERROR) || (rc < 0)) { + VERBOSE (ERROR, fprintf (stderr, "error: %d\n", ERRNO)); + rc = closesocket (sock); + if ((rc == SOCKET_ERROR) || (rc < 0)) { + VERBOSE (ERROR, fprintf (stderr, "error: %d\n", ERRNO)); + } + return -1; + } + + VERBOSE (DEBUG, fprintf (stdout, "Configuring socket\n")); +#ifdef _WIN32 /* Windows */ +#else /* Posix */ + fcntl (sock, F_SETFL, O_NONBLOCK); +#endif + int val = 1; + rc = setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof (val)); + if (rc < 0) { + VERBOSE (ERROR, fprintf (stderr, "%s\n", "setsockopt/TCP_NODELAY")); + closesocket (sock); + return -1; + } + + return sock; +} + +/* close listening socket */ +void close_listening_socket (socket_t sock) +{ + closesocket (sock); +#ifdef _WIN32 /* Windows */ + WSACleanup (); +#endif +} + +/* vim: set ts=4 sw=4 et: */ diff --git a/server.h b/server.h new file mode 100644 index 0000000..962cb00 --- /dev/null +++ b/server.h @@ -0,0 +1,16 @@ +#ifndef __SERVER_H__ +#define __SERVER_H__ + +#ifdef _WIN32 /* Windows */ +#include +typedef SOCKET socket_t; +#else /* Posix */ +typedef int socket_t; +#endif + +socket_t open_listening_socket (int port); +void close_listening_socket (socket_t sock); + +#endif /* __SERVER_H__ */ + +/* vim: set ts=4 sw=4 et: */ diff --git a/webserver.c b/webserver.c index 530f1aa..0673b9c 100644 --- a/webserver.c +++ b/webserver.c @@ -1,33 +1,16 @@ /* depend: */ /* cflags: */ -/* linker: color.o debug.o */ +/* linker: color.o debug.o server.o */ #include #include #include -#ifdef _WIN32 /* Windows */ -#include -#include -#else /* Posix */ -#include -#include -#include -#include -#include -#include -#include -#endif #include "debug.h" +#include "server.h" /* types */ -#ifdef _WIN32 /* Windows */ -typedef SOCKET socket_t; -#else /* Posix */ -typedef int socket_t; -#endif - /* constants */ #define BUFFER_SIZE 4096 @@ -52,83 +35,6 @@ int usage (int ret) return ret; } -/* open listening socket */ - -socket_t open_listening_socket (int port) -{ -#ifdef _WIN32 /* Windows */ - WSADATA WSAData; - WSAStartup (MAKEWORD(2,0), &WSAData); - assert (INVALID_SOCKET == (socket_t)-1); -#endif - - VERBOSE (DEBUG, fprintf (stdout, "Opening socket\n")); -#ifdef _WIN32 /* Windows */ - socket_t sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (sock == INVALID_SOCKET) - return -1; -#else /* Posix */ - socket_t sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP); - if (sock < 0) - return -1; -#endif - - struct sockaddr_in addr = {0}; -#ifdef _WIN32 /* Windows */ - addr.sin_family = AF_INET; -#else /* Posix */ - addr.sin_family = PF_INET; -#endif - addr.sin_port = htons (port); - addr.sin_addr.s_addr = htonl (INADDR_ANY); - - VERBOSE (DEBUG, fprintf (stdout, "Binding socket\n")); - int rc = bind (sock, (struct sockaddr *)&addr, sizeof (addr)); -#ifdef _WIN32 /* Windows */ - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, fprintf (stderr, "error: %d\n", WSAGetLastError ())); - if (closesocket (sock) == SOCKET_ERROR) { - VERBOSE (ERROR, fprintf (stderr, "error: %d\n", WSAGetLastError ())); - } -#else /* Posix */ - if (rc < 0) { - VERBOSE (ERROR, fprintf (stderr, "error: %d\n", errno)); - close (sock); -#endif - return -1; - } - - VERBOSE (DEBUG, fprintf (stdout, "Configuring socket\n")); -#ifdef _WIN32 /* Windows */ -#else /* Posix */ - fcntl (sock, F_SETFL, O_NONBLOCK); -#endif - int val = 1; - rc = setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof (val)); - if (rc < 0) { - VERBOSE (ERROR, fprintf (stderr, "%s\n", "setsockopt/TCP_NODELAY")); -#ifdef _WIN32 /* Windows */ - closesocket (sock); -#else /* Posix */ - close (sock); -#endif - return -1; - } - - return sock; -} - -/* close listening socket */ -void close_listening_socket (socket_t sock) -{ -#ifdef _WIN32 /* Windows */ - closesocket (sock); - WSACleanup (); -#else /* Posix */ - close (sock); -#endif -} - /* main function */ int main (int argc, char *argv[])