extract server code into separared file
[webserver.git] / server.c
diff --git a/server.c b/server.c
new file mode 100644 (file)
index 0000000..0a50df1
--- /dev/null
+++ b/server.c
@@ -0,0 +1,104 @@
+/* depend: */
+/* cflags: */
+/* linker: color.o debug.o */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _WIN32 /* Windows */
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else /* Posix */
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+//#include <sys/types.h>
+//#include <sys/socket.h>
+#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: */