You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by su...@apache.org on 2008/06/12 09:18:14 UTC

svn commit: r666996 - /webservices/axis2/trunk/c/util/src/network_handler.c

Author: supun
Date: Thu Jun 12 00:18:14 2008
New Revision: 666996

URL: http://svn.apache.org/viewvc?rev=666996&view=rev
Log:
Handling the socket errors properly in Windows.

AXIS2C-1109. Thanks Pim Philipse for pointing this out.

Modified:
    webservices/axis2/trunk/c/util/src/network_handler.c

Modified: webservices/axis2/trunk/c/util/src/network_handler.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/util/src/network_handler.c?rev=666996&r1=666995&r2=666996&view=diff
==============================================================================
--- webservices/axis2/trunk/c/util/src/network_handler.c (original)
+++ webservices/axis2/trunk/c/util/src/network_handler.c Thu Jun 12 00:18:14 2008
@@ -21,6 +21,13 @@
 #include <axutil_network_handler.h>
 #include <fcntl.h>
 
+#define AXUTIL_NETWORK_HANDLER_ERRBUFSIZE 256 
+
+static void AXIS2_CALL
+axutil_network_handler_get_win32_error_message(const axutil_env_t *env, 
+											   axis2_char_t *buff,
+											   unsigned int buf_size);
+
 #if defined(WIN32)
 /* fix for an older version of winsock2.h */
 #if !defined(SO_EXCLUSIVEADDRUSE)
@@ -56,12 +63,28 @@
     AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE);
     AXIS2_PARAM_CHECK(env->error, server, AXIS2_INVALID_SOCKET);
 
+#ifndef WIN32
     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
         /*AF_INET is not defined in sys/socket.h but PF_INET */
     {
+		INVALID_SOCKET
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+        return AXIS2_INVALID_SOCKET;
+    }
+#else
+	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
+        /* In Win 32 if the socket creation failed it return 0 not a negative value */
+    {
+		char buf[AXUTIL_NETWORK_HANDLER_ERRBUFSIZE]; 
+		/* Get the detailed error message */
+		axutil_network_handler_get_win32_error_message(env, buf, 
+			AXUTIL_NETWORK_HANDLER_ERRBUFSIZE);	
+
+		AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); 
         AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
         return AXIS2_INVALID_SOCKET;
     }
+#endif 
 
     memset(&sock_addr, 0, sizeof(sock_addr));
     sock_addr.sin_family = AF_INET;
@@ -124,12 +147,23 @@
     }
 #endif
     sock = socket(AF_INET, SOCK_STREAM, 0);
+
+#ifndef WIN32
     if (sock < 0)
     {
         AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
         return AXIS2_INVALID_SOCKET;
     }
-
+#else
+	if (sock == INVALID_SOCKET)
+	{
+		axis2_char_t buf[AXUTIL_NETWORK_HANDLER_ERRBUFSIZE];
+		axutil_network_handler_get_win32_error_message(env, buf, AXUTIL_NETWORK_HANDLER_ERRBUFSIZE);
+		AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+		AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); 
+        return AXIS2_INVALID_SOCKET;
+	}
+#endif
     /* Address re-use */
     i = 1;
 #if defined(WIN32)
@@ -218,10 +252,21 @@
 
     cli_len = sizeof(cli_addr);
     cli_socket = accept(svr_socket, (struct sockaddr *) &cli_addr, &cli_len);
+#ifndef WIN32
     if (cli_socket < 0)
+	{
         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
                         "[Axis2][network_handler] Socket accept \
                 failed");
+	}
+#else
+	if (cli_socket == INVALID_SOCKET)
+	{
+		axis2_char_t buf[AXUTIL_NETWORK_HANDLER_ERRBUFSIZE];
+		axutil_network_handler_get_win32_error_message(env, buf, AXUTIL_NETWORK_HANDLER_ERRBUFSIZE);
+		AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); 
+	}
+#endif 
 
     setsockopt(svr_socket, IPPROTO_TCP, TCP_NODELAY, (const char *)&nodelay, (int)sizeof(nodelay));
     /* We are sure that the difference lies within the int range */
@@ -296,3 +341,24 @@
     ret = inet_ntoa(addr.sin_addr);
     return ret;
 }
+
+static void AXIS2_CALL
+axutil_network_handler_get_win32_error_message(const axutil_env_t *env, 
+											   axis2_char_t *buf, 
+											   unsigned int buf_size)
+{
+	LPVOID lpMsgBuf;	
+	int rc = WSAGetLastError();
+	sprintf( buf, "Winsock error %d: ", rc );
+	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+				  NULL,
+	              rc,
+	              MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
+				  (LPTSTR) &lpMsgBuf,
+				  0,
+				  NULL
+				);
+
+	strncat( buf, (char*)lpMsgBuf, buf_size - strlen( buf ) - 1 );
+	LocalFree( lpMsgBuf );
+}
\ No newline at end of file