axis-c-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Samisa Abeysinghe <sam...@wso2.com>
Subject Re: [Axis2] Added network handling functions
Date Mon, 09 Jan 2006 09:29:14 GMT
IMHO, we have to use the 'platform' concept here in the impl file, and I 
think it is better to have the provision now.
Basically my point is that nw handler should not have any platform 
specific code. Also better to think of IPv6 as well. We can learn some 
stuff from Axis C++ here.

Thanks,
Samisa...

Sahan Gamage wrote:

>-----BEGIN PGP SIGNED MESSAGE-----
>Hash: SHA1
>
>Hi,
>
>I have added axis2_network_handler.h and network_handler.c to handle
>network specific functions (such as creation of sockets). The .h file
>serves as an abstraction and .c file is one implementation (using BSD
>sockets). Pls review and commit the code.
>
>- - Sahan
>-----BEGIN PGP SIGNATURE-----
>Version: GnuPG v1.4.1 (GNU/Linux)
>Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
>
>iQEVAwUBQ8H5pKnIlEsDdb85AQJ6QwgAlZ7On/ZyQkqKIT3rqLtArUewb8XSo27E
>J6a8JkaHzgFzr4/LtfgWO4liKWBY3emE8FYW81CoUsDHFE12DoE2CdVB1fu12cRD
>6rAoXJA/miQuKxO5xUG4r+V7DpIZccRyW83KVba5osNsdNzC9/1wF5MhjZ3fbiXz
>1RQxVir5PeUh9m6yKHay8a+0pbpQtymn/JcibTXem7Q94nqEggfAmx4/mf8UpKgt
>4rSCTplB+wSxfB8vn0bDpZlQ8CXFFE0gdvhWy/itofT5M4ZGZw2GSz2qYQ9f92mD
>ivlb0iw5ww+aNhPnYR7aflAansvvoEt4kcOdvEoAaMOuha4eHyN3Bg==
>=enHE
>-----END PGP SIGNATURE-----
>
>  
>
>------------------------------------------------------------------------
>
>/*
> * 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 AXIS2_NETWORK_HANDLER_H
>#define AXIS2_NETWORK_HANDLER_H
>
>#include <axis2.h>
>#include <axis2_defines.h>
>#include <axis2_env.h>
>#include <sys/types.h>
>#include <sys/socket.h>
>
>
>
>#ifdef __cplusplus
>extern "C"
>{
>#endif
>
>
>/**
> * @defgroup axis2_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_DECLARE(int) 
>axis2_network_handler_open_socket(axis2_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_DECLARE(int) 
>axis2_network_handler_create_server_socket(axis2_env_t **env, int port);
>
>/**
> * closes a socket
> * @param opened socket that need to be closed
> * @return status code
> */
>AXIS2_DECLARE(axis2_status_t) 
>axis2_network_handler_close_socket (axis2_env_t **env, int socket);
>
>/**
> * used to set up socket options such as timeouts, non-blocking ..etc
> * @param socket valid socket (obtained by socket() or similar callo
> * @param option the name of the option
> * @param value Value to be set
> * @return status of the operations as axis2_status_t
> */
>AXIS2_DECLARE(axis2_status_t)
>axis2_network_handler_set_sock_option(axis2_env_t **env, int socket, 
>						int option, int value);
>						
>/** @} */
>    
>#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 a 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.
> */
>
>#include <string.h>
>#include <stdlib.h>
>#include <stdio.h>
>#include <unistd.h>
>#include <axis2_network_handler.h>
>#include <arpa/inet.h>
>#include <netinet/in.h>
>#include <netdb.h>
>#include <fcntl.h>
>
>int AXIS2_CALL
>axis2_network_handler_open_socket(axis2_env_t **env, char *server, int port)
>{
>	int sock = -1;
>	struct sockaddr_in sock_addr;
>	
>    AXIS2_PARAM_CHECK((*env)->error, server, AXIS2_CRTICAL_FAILURE);
>	
>	if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
>	{
>		AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
>		return -1;
>	}
>	
>    memset(&sock_addr,0,sizeof(sock_addr));
>    sock_addr.sin_family = AF_INET;
>    sock_addr.sin_addr.s_addr = inet_addr(server);
>
>    if (sock_addr.sin_addr.s_addr == (in_addr_t)-1)
>    {
>        /**
>         * server may be a host name
>         */
>        struct hostent* lphost = NULL;
>        lphost = gethostbyname(server);
>
>        if (NULL != lphost)
>            sock_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 -1;
>        }
>    }
>
>    sock_addr.sin_port = htons((uint16_t)port);
>	/** Connect to server */
>    if (connect(sock, (struct sockaddr*)&sock_addr, sizeof(sock_addr)) < 0)
>    {
>        close(sock);
>		AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
>        return -1;
>    }
>	return sock;
>}
>
>int AXIS2_CALL
>axis2_network_handler_create_server_socket(axis2_env_t **env, int port)
>{
>	int sock = -1;
>	unsigned int i = 0;
>	struct sockaddr_in sock_addr;
>	sock = socket(AF_INET, SOCK_STREAM, 0);
>	if(sock < 0)
>	{
>		AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
>		return -1;
>	}
>	/** Address re-use */
>	i = 1;
>	setsockopt(sock, SOL_SOCKET, SO_REUSEADDR ,&i, sizeof(int));
>	/** Exec behaviour */
>	fcntl(sock, F_SETFD, FD_CLOEXEC);
>	
>	
>    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((uint16_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 -1;
>	}
>	return sock;
>}
>
>axis2_status_t AXIS2_CALL
>axis2_network_handler_close_socket (axis2_env_t **env, int socket)
>{
>	if(socket < 0)
>	{
>		AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_INVALID_SOCKET,
>							AXIS2_FAILURE);
>		return AXIS2_FAILURE;
>	}
>	if(0 != close(socket))
>	{
>		return AXIS2_FAILURE;
>	}
>	return AXIS2_SUCCESS;
>}
>
>axis2_status_t AXIS2_CALL
>axis2_network_handler_set_sock_option(axis2_env_t **env, int socket, 
>						int option, int value)
>{
>	if(option == SO_RCVTIMEO || option == SO_SNDTIMEO)
>	{
>		struct timeval tv;
>		/* we deal with milliseconds */
>		tv.tv_sec = value/1000;
>		tv.tv_usec = (value%1000) * 1000;
>		setsockopt(socket, SOL_SOCKET, option, &tv, sizeof(tv));
>		return AXIS2_SUCCESS;
>	}
>	return AXIS2_FAILURE;    
>}
>  
>


Mime
View raw message