X-Git-Url: https://secure.softndesign.org/git/?a=blobdiff_plain;f=server.c;h=b2a564d9767a23cb73921fa3c51c204125c24ecb;hb=refs%2Fheads%2Fmaster;hp=039d4330e0e1da6ce9887e3c0fcaa15f19e0fd52;hpb=8ca9131b0029145aea25faacb4088d8d479f1aa0;p=webserver.git diff --git a/server.c b/server.c index 039d433..b2a564d 100644 --- a/server.c +++ b/server.c @@ -82,10 +82,20 @@ void init_network_context (void) /* terminate network context */ +void _closesocket (socket_t sock) +{ + if (sock != INVALID_SOCKET) { + int rc = closesocket (sock); + if (rc == SOCKET_ERROR) { + VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); + } + } +} + void terminate_network_context (void) { - closesocket (sock); - closesocket (conn); + _closesocket (sock); + _closesocket (conn); #ifdef _WIN32 /* Windows */ WSACleanup (); #endif @@ -99,15 +109,9 @@ int open_listening_socket (int port) VERBOSE (DEBUG, PRINT ("Opening socket\n")); //socket_t sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP); - if (sock != INVALID_SOCKET) { - int rc = closesocket (sock); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } - sock = INVALID_SOCKET; - } - sock = socket (AF_INET, SOCK_STREAM, 0); - if (sock == INVALID_SOCKET) { + _closesocket (sock); + socket_t _sock = socket (AF_INET, SOCK_STREAM, 0); + if (_sock == INVALID_SOCKET) { return 0; } @@ -119,44 +123,34 @@ int open_listening_socket (int port) addr.sin_addr.s_addr = htonl (INADDR_ANY); VERBOSE (DEBUG, PRINT ("Binding socket\n")); - //setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof (val)); - int rc = bind (sock, (struct sockaddr *)&addr, sizeof (addr)); + //setsockopt (_sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof (val)); + int rc = bind (_sock, (struct sockaddr *)&addr, sizeof (addr)); if (rc == SOCKET_ERROR) { VERBOSE (ERROR, PERROR ("error: bind %d\n", ERRNO)); - rc = closesocket (sock); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } - sock = INVALID_SOCKET; + _closesocket (_sock); return 0; } VERBOSE (DEBUG, PRINT ("Configuring socket\n")); #ifndef _WIN32 /* Posix */ - fcntl (sock, F_SETFL, O_NONBLOCK); + fcntl (_sock, F_SETFL, O_NONBLOCK); #endif - rc = setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof (val)); + rc = setsockopt (_sock, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof (val)); if (rc < 0) { VERBOSE (ERROR, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY")); - closesocket (sock); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } - sock = INVALID_SOCKET; + _closesocket (_sock); return 0; } - rc = listen (sock, BACKLOG); + rc = listen (_sock, BACKLOG); if (rc < 0) { VERBOSE (ERROR, PERROR ("error: %s\n", "listen")); - closesocket (sock); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } - sock = INVALID_SOCKET; + _closesocket (_sock); return 0; } + sock = _sock; + return 1; } @@ -170,32 +164,27 @@ int accept_incoming_connection (void) } if (conn != INVALID_SOCKET) { - int rc = closesocket (conn); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } + _closesocket (conn); conn = INVALID_SOCKET; } - conn = accept (sock, NULL, 0); - if (conn == INVALID_SOCKET) { + socket_t _conn = accept (sock, NULL, 0); + if (_conn == INVALID_SOCKET) { return 0; } #ifndef _WIN32 /* POSIX */ - fcntl (conn, F_SETFL, O_NONBLOCK); + fcntl (_conn, F_SETFL, O_NONBLOCK); #endif int val = 1; - int rc = setsockopt (conn, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof (val)); + int rc = setsockopt (_conn, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof (val)); if (rc < 0) { VERBOSE (ERROR, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY")); - closesocket (conn); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } - conn = INVALID_SOCKET; + _closesocket (_conn); return 0; } + conn = _conn; + return 1; } @@ -203,19 +192,16 @@ int accept_incoming_connection (void) void close_connection (void) { - int rc = closesocket (conn); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: %d\n", ERRNO)); - } + _closesocket (conn); conn = INVALID_SOCKET; } /* receive data from socket */ -int receive_data (unsigned char **pdata) +int receive_data (char **pdata) { - unsigned char buffer[BUFFER_SIZE] = {0}; - unsigned char *data = NULL; + char buffer[BUFFER_SIZE] = {0}; + char *data = NULL; int len = 0; if (conn == INVALID_SOCKET) { @@ -237,22 +223,15 @@ int receive_data (unsigned char **pdata) } /* read from socket */ - int rc = read (conn, buffer, BUFFER_SIZE); + int rc = recv (conn, buffer, BUFFER_SIZE, 0); + VERBOSE (DEBUG, PRINT ("rc: %d\nerrno: %d\n", rc, ERRNO)); - if (rc == 0) { /* sock closed */ + if (rc == 0) { /* sock closed or error */ if (data) { free (data); data = NULL; - len = 0; } - break; - - } else if ((rc < 0) && (ERRNO != EAGAIN)) { /* error */ - if (data) { - free (data); - data = NULL; - } - len = -1; + len = (rc < 0) ? -1 : 0; break; } else if (rc > 0) { @@ -270,7 +249,7 @@ int receive_data (unsigned char **pdata) /* send data onto socket */ -int send_data (unsigned char *data, int len) +int send_data (char *data, int len) { int index = 0; @@ -280,13 +259,10 @@ int send_data (unsigned char *data, int len) } while (index < len) { - int rc = write (conn, data + index, len - index); + int rc = send (conn, data + index, len - index, 0); - if (rc == 0) { /* sock closed */ - index = 0; - break; - } else if ((rc < 0) && (ERRNO != EAGAIN)) { /* error */ - index = -1; + if (rc <= 0) { /* sock closed or error */ + index = (rc < 0) ? -1 : 0; break; } else if (rc > 0) { index += rc;