My application creats a TCP connection, This is working normaly. But in one network server has many IP say
- 174.X.X.X
- 54.x.x.x like this
When calling TCP connect (Non blocking with timeout of 60 seconds)
to IP 174.X.X.X
is always success .
But TCP connect to same server with ip 54.x.x.x
is failing (most of the times) with errno 115
measn operation in progress.
Can you please explain me what are the possible reason for errno 115
OS : Linux
My TCP conenct code is as below
tcp_connect(......)
{
int iValOpt = 0;
int iLength= 0;
fcnt((int)(long)SockID,F_SETFL_O_NONBLOCK);
ret = connect (sockID,(struct sockaddr*)pstSockAdr,uiSockLen);
if (ret < 0)
{
if (errno == EINPROGRESS)
{
stTv.tv_sec = 60;
stTv.tv_usec = 0;
FD_ZERO(&write_fd);
FD_SET(sockID,&write_fd);
iLength = sizeof(int);
if (0 < select (sockID+1) , NULL,&write_fd,NULL,&stTv);
{
if(0 > getsockopt(sockID,SOL_SOCKET,SO_ERROR,(void*)(&iValOpt),&iLength))
{
return -1
}
if (0 != iValOpt)
{
return -1;
}
return success;
}
else
{
return -1;
}
}
else
{
return -1;
}
}
return success;
}
Based on your information:
connect()
to54.x.x.x
non-blocking
60 sec
First, if you look into your
/usr/include/asm-generic/errno.h
you'll see the following:It means an existing operation on the socket is in progress. Since, you said you are doing a
connect()
call, lets do aman connect
:So, the best guess would be that the TCP 3-way handshake (your
connect()
call to54.x.x.x
IP address) is taking longer than expected to complete. Since theconnect()
operation is already in progress, any subsequent operation on the socket is resulting intoEINPROGRESS
error code. As suggested in the man page, try to useselect()
orpoll()
to check if your socket is ready to use (to performread()
orwrite()
calls).You can pin-point what is preventing your TCP handshake to complete by capturing and analyzing the traffic to/from your own machine and
54.x.x.x
. The best tool to help you with this is called WireShark. Good luck.This seems to be the behaviour of connect():