assert (SOCKET_ERROR == -1);
#endif
+#ifndef _WIN32 /* Posix */
signal (SIGINT, &stop_server);
- signal (SIGQUIT, &stop_server);
+#endif
signal (SIGABRT, &stop_server);
signal (SIGSEGV, &stop_server);
signal (SIGTERM, &stop_server);
/* 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
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;
}
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;
}
}
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;
}
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) {
}
/* 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) {
/* send data onto socket */
-int send_data (unsigned char *data, int len)
+int send_data (char *data, int len)
{
int index = 0;
}
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;