我的应用程序创建了一个TCP连接,这是正常的。 但是在一个网络服务器上有很多IP说
调用TCP连接时(非阻塞,超时为60秒)
知识产权174.X.X.X
总是成功的。
但是,使用ip 54.x.x.x
连接到同一服务器的TCP与errno 115失败(大多数情况下)
正在进行的措施。
请你解释一下errno 115
的可能原因操作系统:Linux
我的TCP连接代码如下
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;
}
答案 0 :(得分:19)
根据您的信息:
connect()
至54.x.x.x
non-blocking
60 sec
首先,如果您查看/usr/include/asm-generic/errno.h
,您会看到以下内容:
#define EINPROGRESS 115 /* Operation now in progress */
这表示套接字上的现有操作正在进行中。既然,您说您正在进行connect()
来电,请允许man connect
:
EINPROGRESS The socket is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select(2) indicates writability, use getsockopt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether connect() completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure).
因此,最好的猜测是TCP 3次握手(connect()
对54.x.x.x
IP地址的调用)花费的时间比预期的要长。由于connect()
操作已在进行中,因此套接字上的任何后续操作都会导致EINPROGRESS
错误代码。根据手册页中的建议,尝试使用select()
或poll()
检查您的套接字是否可以使用(执行read()
或write()
次呼叫)。
您可以通过捕获和分析来自您自己的计算机和54.x.x.x
的流量来确定阻止TCP握手完成的内容。帮助您解决此问题的最佳工具称为WireShark。祝你好运。
答案 1 :(得分:5)
这似乎是connect():
的行为如果无法立即建立连接且O_NONBLOCK为 设置为套接字的文件描述符,connect()将失败 将errno设置为[EINPROGRESS],但连接请求不应该 中止,并且应该异步建立连接。 后续调用connect()为同一个套接字 建立连接,失败并将错误设置为[EALREADY]。