in util/src/network_handler.c [34:118]
axis2_bool_t axis2_init_socket(
);
#endif
AXIS2_EXTERN axis2_socket_t AXIS2_CALL
axutil_network_handler_open_socket(
const axutil_env_t *env,
char *server,
int port)
{
axis2_socket_t sock = AXIS2_INVALID_SOCKET;
struct sockaddr_in sock_addr;
struct linger ll;
int nodelay = 1;
#if defined(WIN32)
if (is_init_socket == 0)
{
axis2_init_socket();
is_init_socket = 1;
}
#endif
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 */
{
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_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
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr.s_addr = inet_addr(server); /*arpa/inet.d */
if(sock_addr.sin_addr.s_addr == AXIS2_INADDR_NONE) /*netinet/in.h */
{
/*
* server may be a host name
*/
struct hostent *lphost = NULL;
lphost = gethostbyname(server);
if(lphost)
{
sock_addr.sin_addr.s_addr = ((struct in_addr *)lphost->h_addr)->s_addr;
}
else
{
AXIS2_CLOSE_SOCKET(sock);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_ADDRESS, AXIS2_FAILURE);
return AXIS2_INVALID_SOCKET;
}
}
sock_addr.sin_port = htons((axis2_unsigned_short_t)port);
/* Connect to server */
if(connect(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0)
{
AXIS2_CLOSE_SOCKET(sock);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE);
return AXIS2_INVALID_SOCKET;
}
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&nodelay, sizeof(nodelay));
ll.l_onoff = 1;
ll.l_linger = 5;
setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *)&ll, sizeof(struct linger));
return sock;
}