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/08/06 07:26:49 UTC

svn commit: r683111 - in /webservices/axis2/trunk/c/util: include/axutil_network_handler.h include/platforms/windows/axutil_windows.h src/network_handler.c

Author: supun
Date: Tue Aug  5 22:26:48 2008
New Revision: 683111

URL: http://svn.apache.org/viewvc?rev=683111&view=rev
Log:
Added few utility functions for the network_handler.c.

Modified:
    webservices/axis2/trunk/c/util/include/axutil_network_handler.h
    webservices/axis2/trunk/c/util/include/platforms/windows/axutil_windows.h
    webservices/axis2/trunk/c/util/src/network_handler.c

Modified: webservices/axis2/trunk/c/util/include/axutil_network_handler.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/util/include/axutil_network_handler.h?rev=683111&r1=683110&r2=683111&view=diff
==============================================================================
--- webservices/axis2/trunk/c/util/include/axutil_network_handler.h (original)
+++ webservices/axis2/trunk/c/util/include/axutil_network_handler.h Tue Aug  5 22:26:48 2008
@@ -1,120 +1,194 @@
-
-/*
- * Copyright 2004,2005 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain count copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef AXUTIL_NETWORK_HANDLER_H
-#define AXUTIL_NETWORK_HANDLER_H
-
-#include <axutil_utils.h>
-#include <axutil_utils_defines.h>
-#include <axutil_env.h>
-#include <sys/types.h>
-#include <platforms/axutil_platform_auto_sense.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-    /**
-     * @defgroup axutil_network_handler network handler
-     * @ingroup axis2_util
-     * @{
-     */
-
-    /**
-     * open a socket for a given server
-     * @param server ip address or the fqn of the server
-     * @param port port of the service
-     * @return opened socket
-     */
-    AXIS2_EXTERN axis2_socket_t AXIS2_CALL
-
-    axutil_network_handler_open_socket(
-        const axutil_env_t * env,
-        char *server,
-        int port);
-
-    /**
-     * creates a server socket for a given port
-     * @param port port of the socket to be bound
-     * @return creates server socket
-     */
-    AXIS2_EXTERN axis2_socket_t AXIS2_CALL
-
-    axutil_network_handler_create_server_socket(
-        const axutil_env_t * env,
-        int port);
-
-    /**
-     * closes a socket
-     * @param opened socket that need to be closed
-     * @return status code
-     */
-    AXIS2_EXTERN axis2_status_t AXIS2_CALL
-
-    axutil_network_handler_close_socket(
-        const axutil_env_t * env,
-        axis2_socket_t socket);
-
-    /**
-     * used to set up socket options such as timeouts, non-blocking ..etc
-     * @param socket valid socket (obtained by socket() or similar call)
-     * @param option the name of the option
-     * @param value Value to be set
-     * @return status of the operations as axis2_status_t
-     */
-    AXIS2_EXTERN axis2_status_t AXIS2_CALL
-
-    axutil_network_handler_set_sock_option(
-        const axutil_env_t * env,
-        axis2_socket_t socket,
-        int option,
-        int value);
-
-    /**
-     * Accepts remote connections for a server socket
-     * @param socket valid server socket (obtained by socket() or similar call)
-     * @return created socket to handle the incoming client connection
-     */
-    AXIS2_EXTERN axis2_socket_t AXIS2_CALL
-
-    axutil_network_handler_svr_socket_accept(
-        const axutil_env_t * env,
-        axis2_socket_t socket);
-
-    /**
-     * Returns the ip address of the server associated with the socket
-     * @param socket valid socket (obtained by accept() or similar call)
-     * @return ip address asoociated with the socket or NULL
-     */
-    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
-    axutil_network_handler_get_svr_ip(
-        const axutil_env_t * env,
-        axis2_socket_t socket);
-
-    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
-    axutil_network_handler_get_peer_ip(
-        const axutil_env_t * env,
-        axis2_socket_t socket);
-
-    /** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif                          /* AXIS2_NETWORK_HANDLER_H */
+
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain count copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AXUTIL_NETWORK_HANDLER_H
+#define AXUTIL_NETWORK_HANDLER_H
+
+#include <axutil_utils.h>
+#include <axutil_utils_defines.h>
+#include <axutil_env.h>
+#include <sys/types.h>
+#include <platforms/axutil_platform_auto_sense.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /**
+     * @defgroup axutil_network_handler network handler
+     * @ingroup axis2_util
+     * @{
+     */
+
+    /**
+     * open a socket for a given server
+     * @param server ip address or the fqn of the server
+     * @param port port of the service
+     * @return opened socket
+     */
+    AXIS2_EXTERN axis2_socket_t AXIS2_CALL
+
+    axutil_network_handler_open_socket(
+        const axutil_env_t * env,
+        char *server,
+        int port);
+
+    /**
+     * creates a server socket for a given port
+     * @param port port of the socket to be bound
+     * @return creates server socket
+     */
+    AXIS2_EXTERN axis2_socket_t AXIS2_CALL
+
+    axutil_network_handler_create_server_socket(
+        const axutil_env_t * env,
+        int port);
+
+    /**
+     * closes a socket
+     * @param opened socket that need to be closed
+     * @return status code
+     */
+    AXIS2_EXTERN axis2_status_t AXIS2_CALL
+
+    axutil_network_handler_close_socket(
+        const axutil_env_t * env,
+        axis2_socket_t socket);
+
+    /**
+     * used to set up socket options such as timeouts, non-blocking ..etc
+     * @param socket valid socket (obtained by socket() or similar call)
+     * @param option the name of the option
+     * @param value Value to be set
+     * @return status of the operations as axis2_status_t
+     */
+    AXIS2_EXTERN axis2_status_t AXIS2_CALL
+
+    axutil_network_handler_set_sock_option(
+        const axutil_env_t * env,
+        axis2_socket_t socket,
+        int option,
+        int value);
+
+    /**
+     * Accepts remote connections for a server socket
+     * @param socket valid server socket (obtained by socket() or similar call)
+     * @return created socket to handle the incoming client connection
+     */
+    AXIS2_EXTERN axis2_socket_t AXIS2_CALL
+
+    axutil_network_handler_svr_socket_accept(
+        const axutil_env_t * env,
+        axis2_socket_t socket);
+
+    /**
+     * Returns the ip address of the server associated with the socket
+     * @param socket valid socket (obtained by accept() or similar call)
+     * @return ip address asoociated with the socket or NULL
+     */
+    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
+    axutil_network_handler_get_svr_ip(
+        const axutil_env_t * env,
+        axis2_socket_t socket);
+
+    AXIS2_EXTERN axis2_char_t *AXIS2_CALL
+    axutil_network_handler_get_peer_ip(
+        const axutil_env_t * env,
+        axis2_socket_t socket);
+
+	/* 
+	 * Create a datagram socket. 
+	 * @param env pointer to env
+	 * @return a datagram socket
+	 */
+	AXIS2_EXTERN axis2_socket_t AXIS2_CALL
+	axutil_network_handler_open_dgram_socket(const axutil_env_t *env);
+
+	/*
+	 * Send a UDP packet to the given source and port address.
+	 * Read a incoming UDP packet from the port and server address.
+	 * @param env pointer to the env structure
+	 * @param socket a datagram socket
+	 * @param buffer a buffer containing the data to be sent
+	 * @param buf_len length of the buffer
+	 * @param addr address of the source field
+	 * @param port udp port number
+	 * @return success if everything goes well
+	 */
+	AXIS2_EXTERN axis2_status_t AXIS2_CALL 
+	axutil_network_handler_send_dgram(const axutil_env_t *env, axis2_socket_t socket, 
+								 axis2_char_t *buff, int *buf_len, 
+								 axis2_char_t *addr, int dest_port, int *source_port);
+
+	/* 
+	 * Read a incoming UDP packet from the port and server address.
+	 * @param env pointer to the env structure
+	 * @param socket a datagram socket
+	 * @param buffer a buffer allocated and passed to be filled
+	 * @param buf_len length of the buffer allocated. In return buffer len 
+	                  contains the length of the data read
+	 * @param addr address of the sender. This is a return value.
+	 * @param port senders port address. Return value
+	 * @return if everything goes well return success 
+	 */
+	AXIS2_EXTERN axis2_status_t AXIS2_CALL
+	axutil_network_handler_read_dgram(const axutil_env_t *env, axis2_socket_t socket, 
+									 axis2_char_t *buffer, int *buf_len,
+									 axis2_char_t **addr, int *port);
+
+	/* 
+	 * Create a datagram socket to receive incoming UDP packets.
+	 * @param env a pointer to the env structure
+	 * @param port udp port to listen
+	 * @return AXIS2_SUCCESS if everything goes well
+	 */
+	AXIS2_EXTERN axis2_socket_t AXIS2_CALL
+	axutil_network_handler_create_dgram_svr_socket(
+									const axutil_env_t *env, 
+									int port);
+
+	/* 
+	 * Bind a socket to the specified address
+	 * @param env a pointer to the env structure
+	 * @param sock socket
+	 * @param port port number to bind to
+	 * @return AXIS2_SUCCESS if binding is performed
+	 */
+	AXIS2_EXTERN axis2_status_t AXIS2_CALL
+	axutil_network_handler_bind_socket(const axutil_env_t *env, 
+									axis2_socket_t sock, int port);
+
+	/* 
+	 * Create a multicast socket for listening on the given port. 
+	 * @param env a pointer to the env structure
+	 * @param port udp port to listen
+	 * @param mul_addr multicast address to join. The address should be valid and in dotted format.
+	 * @param ttl TTL value. 
+	 * @return AXIS2_SUCCESS if everything goes well.s
+	 */
+	AXIS2_EXTERN axis2_socket_t AXIS2_CALL
+	axutil_network_hadler_create_multicast_svr_socket(const axutil_env_t *env, 
+									int port, axis2_char_t *mul_addr);
+
+    /** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif                          /* AXIS2_NETWORK_HANDLER_H */

Modified: webservices/axis2/trunk/c/util/include/platforms/windows/axutil_windows.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/util/include/platforms/windows/axutil_windows.h?rev=683111&r1=683110&r2=683111&view=diff
==============================================================================
--- webservices/axis2/trunk/c/util/include/platforms/windows/axutil_windows.h (original)
+++ webservices/axis2/trunk/c/util/include/platforms/windows/axutil_windows.h Tue Aug  5 22:26:48 2008
@@ -55,7 +55,7 @@
 #include <winsock2.h>
 #include <fcntl.h>
 #include <Mswsock.h>
-
+#include <Ws2tcpip.h>
     /* for time */
 #include <time.h>
 #include <sys/timeb.h>

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=683111&r1=683110&r2=683111&view=diff
==============================================================================
--- webservices/axis2/trunk/c/util/src/network_handler.c (original)
+++ webservices/axis2/trunk/c/util/src/network_handler.c Tue Aug  5 22:26:48 2008
@@ -228,6 +228,14 @@
         setsockopt(socket, SOL_SOCKET, option, (char *) &tv, sizeof(tv));
         return AXIS2_SUCCESS;
     }
+	else if (option == SO_REUSEADDR)
+	{
+		if ((setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (char *)&value, sizeof(value))) < 0) 
+		{
+			return AXIS2_FAILURE;
+		}
+		return AXIS2_SUCCESS;
+	}
     return AXIS2_FAILURE;
 }
 
@@ -335,4 +343,311 @@
     return ret;
 }
 
+AXIS2_EXTERN axis2_socket_t AXIS2_CALL
+axutil_network_handler_create_dgram_svr_socket(
+								const axutil_env_t *env, 
+								int port)
+{
+	axis2_socket_t sock = AXIS2_INVALID_SOCKET;
+    struct sockaddr_in sock_addr;
+
+    AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE);
+#if defined(WIN32)
+    if (is_init_socket == 0)
+    {
+        axis2_init_socket();
+        is_init_socket = 1;
+    }
+#endif
+    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+
+#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_WIN32_ERROR_BUFSIZE];
+		axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE);
+		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
+    /* Exec behaviour */
+    AXIS2_CLOSE_SOCKET_ON_EXIT(sock) memset(&sock_addr, 0, sizeof(sock_addr));
+
+    sock_addr.sin_family = AF_INET;
+    sock_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+    sock_addr.sin_port = htons((axis2_unsigned_short_t) port);
+
+    /* Bind the socket to our port number */
+    if (bind(sock, (struct sockaddr *) &sock_addr, sizeof(sock_addr)) < 0)
+    {
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_BIND_FAILED,
+                        AXIS2_FAILURE);
+        return AXIS2_INVALID_SOCKET;
+    }
+    return sock;
+}
+
+AXIS2_EXTERN axis2_socket_t AXIS2_CALL
+axutil_network_handler_open_dgram_socket(const axutil_env_t *env)
+{
+    axis2_socket_t sock = AXIS2_INVALID_SOCKET;
+#if defined(WIN32)
+    if (is_init_socket == 0)
+    {
+        axis2_init_socket();
+        is_init_socket = 1;
+    }
+#endif    
+
+#ifndef WIN32
+    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+        /*AF_INET is not defined in sys/socket.h but PF_INET */
+    {
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+        return AXIS2_INVALID_SOCKET;
+    }
+#else
+	if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET)
+        /* In Win 32 if the socket creation failed it return 0 not a negative value */
+    {
+		char buf[AXUTIL_WIN32_ERROR_BUFSIZE]; 
+		/* Get the detailed error message */
+		axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE);	
+		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 	
+    return sock;
+}
+
+/* 
+ * This function blocks until data is available to read from the socket 
+ * and read all the data in the socket. If the buffer size specified is 
+ * lesser than the actual data a failure will be returned.
+ */
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axutil_network_handler_read_dgram(const axutil_env_t *env, axis2_socket_t sock, 
+								 axis2_char_t *buffer, int *buf_len,
+								 axis2_char_t **addr, int *port)
+{
+	struct sockaddr_in sender_address;
+	int received = 0; 
+	axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE];
+	int sender_address_size = sizeof(sender_address);
+
+	received = recvfrom(sock,  
+						buffer, 
+						*buf_len, 
+						0, 
+						(struct sockaddr *)&sender_address, 
+						&sender_address_size);
+
+#ifdef WIN32
+	if (SOCKET_ERROR == received)
+	{
+		axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE);
+		AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+		AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); 
+        return AXIS2_FAILURE;
+	} 
+#else
+	if (received < 0)
+	{
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+        return AXIS2_INVALID_SOCKET;
+	}
+#endif
+	if (port && addr)
+	{
+		*port = ntohs(sender_address.sin_port);
+		*addr = inet_ntoa(sender_address.sin_addr);
+	}
+	*buf_len = received;
+	return AXIS2_SUCCESS;
+}
+
+/* 
+ * Sends a datagram to the specified location.
+ */
+AXIS2_EXTERN axis2_status_t AXIS2_CALL 
+axutil_network_handler_send_dgram(const axutil_env_t *env, axis2_socket_t sock, 
+								 axis2_char_t *buff, int *buf_len, 
+								 axis2_char_t *addr, int dest_port, int *source_port)
+{
+    struct sockaddr_in recv_addr, source_addr;
+	int send_bytes = 0;	
+	int recv_addr_size;
+	int source_addr_size = sizeof(source_addr);
+	recv_addr_size = sizeof(recv_addr);	
+
+	memset(&recv_addr, 0, sizeof(recv_addr));
+	memset(&recv_addr, 0, sizeof(source_addr));
+
+	recv_addr.sin_addr.s_addr = inet_addr(addr);
+	if (recv_addr.sin_addr.s_addr == AXIS2_INADDR_NONE) /*netinet/in.h */
+    {
+        /*
+         * server may be a host name
+         */
+        struct hostent *lphost = NULL;
+        lphost = gethostbyname(addr);
+
+        if (lphost)
+        {
+            recv_addr.sin_addr.s_addr =
+                ((struct in_addr *) lphost->h_addr)->s_addr;
+        }
+        else
+        {
+            AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_ADDRESS,
+                            AXIS2_FAILURE);
+            return AXIS2_FAILURE;
+        }
+    }
+
+	recv_addr.sin_family = AF_INET;
+	recv_addr.sin_port = htons((axis2_unsigned_short_t)dest_port);
+
+	send_bytes =  sendto(sock, 
+					buff, 
+					*buf_len, 
+					0, 
+					(struct sockaddr *) &recv_addr, 
+					recv_addr_size);	
+
+	getsockname(sock, (SOCKADDR *)&source_addr, &source_addr_size);
+
+#ifdef WIN32
+	if (send_bytes == SOCKET_ERROR)
+	{
+		axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE];
+		axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE);
+		AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+		AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); 
+        return AXIS2_FAILURE;
+	} 
+#else
+	if (send_bytes < 0)
+	{
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+        return AXIS2_FAILURE;
+	}
+#endif
+	if (source_port)
+	{
+		*source_port = ntohs(source_addr.sin_port);
+	}
+	*buf_len = send_bytes;
+	return AXIS2_SUCCESS;
+}
+
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axutil_network_handler_bind_socket(const axutil_env_t *env, axis2_socket_t sock, int port)
+{
+	struct sockaddr_in source_addr;
+
+	memset(&source_addr, 0, sizeof(source_addr));
+	source_addr.sin_family = AF_INET;
+	source_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+	source_addr.sin_port = htons((axis2_unsigned_short_t)port);
+#ifdef WIN32
+	if (bind(sock, (struct sockaddr *)&source_addr, sizeof(source_addr)) == SOCKET_ERROR)
+	{	
+		axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE];
+		axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE);
+		AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+		AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); 
+        return AXIS2_FAILURE;
+	}
+#else
+	if (bind(sock, (struct sockaddr *)&source_addr, sizeof(source_addr)) < 0)
+	{
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+        return AXIS2_INVALID_SOCKET;
+	}
+#endif
+	return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN axis2_socket_t AXIS2_CALL
+axutil_network_hadler_create_multicast_svr_socket(const axutil_env_t *env, int port, 
+												  axis2_char_t *mul_addr)
+{
+	axis2_socket_t sock = AXIS2_INVALID_SOCKET;
+    struct sockaddr_in sock_addr;
+	struct ip_mreq mc_req;
+	axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE];
+
+    AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE);
+#if defined(WIN32)
+    if (is_init_socket == 0)
+    {
+        axis2_init_socket();
+        is_init_socket = 1;
+    }
+#endif
+    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+
+#ifndef WIN32
+    if (sock < 0)
+    {
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+        return AXIS2_FAILURE;
+    }
+#else
+	if (sock == INVALID_SOCKET)
+	{		
+		axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE);
+		AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+		AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); 
+        return AXIS2_FAILURE;
+	}
+#endif
+
+    /* Exec behaviour */
+    AXIS2_CLOSE_SOCKET_ON_EXIT(sock) memset(&sock_addr, 0, sizeof(sock_addr));
+
+    sock_addr.sin_family = AF_INET;
+    sock_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+    sock_addr.sin_port = htons((axis2_unsigned_short_t) port);
+
+    /* Bind the socket to our port number */
+    if (bind(sock, (struct sockaddr *) &sock_addr, sizeof(sock_addr)) < 0)
+    {
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_BIND_FAILED,
+                        AXIS2_FAILURE);
+        return AXIS2_INVALID_SOCKET;
+    }
+	
+	/* Send an IGMP request to join the multicast group */
+	mc_req.imr_multiaddr.s_addr = inet_addr(mul_addr);
+	mc_req.imr_interface.s_addr = htonl(INADDR_ANY) ;
+#ifdef WIN32	
+	if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mc_req, sizeof(mc_req))) == SOCKET_ERROR) {
+		axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE);
+		AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
+		AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); 
+        return AXIS2_FAILURE;
+	}
+#else
+	if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mc_req, sizeof(mc_req))) < 0) {
+	    AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);s
+        return AXIS2_FAILURE;
+	}
+#endif	
+    return sock;
+}
+
+
+
+