TCP 连接错误 115 Operation in Progress 原因是啥?
Posted
技术标签:
【中文标题】TCP 连接错误 115 Operation in Progress 原因是啥?【英文标题】:TCP Connect error 115 Operation in Progress What is the Cause?TCP 连接错误 115 Operation in Progress 原因是什么? 【发布时间】:2012-04-29 13:18:11 【问题描述】:我的应用程序创建了一个 TCP 连接,这工作正常。 但是在一个网络服务器有很多IP说
174.X.X.X 54.x.x.x 像这样调用 TCP 连接时(非阻塞,超时 60 秒)
到 IP 174.X.X.X
总是成功的。
但是使用 ip 54.x.x.x
连接到同一服务器的 TCP 失败(大多数情况下),错误号为 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;
【问题讨论】:
如果您在不使用应用程序的情况下尝试 telnet 到 54.x.x.x ip 会发生什么?同样的行为? 不,手动腻子应用工作正常 '非阻塞超时'是一个矛盾的术语。 【参考方案1】:根据您的信息:
您正在尝试将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
:
因此,最好的猜测是 TCP 3 次握手(您的 connect()
对 54.x.x.x
IP 地址的调用)所用的时间比预期的要长。由于connect()
操作已经在进行中,因此对套接字的任何后续操作都会导致EINPROGRESS
错误代码。按照手册页中的建议,尝试使用select()
或poll()
来检查您的套接字是否可以使用(执行read()
或write()
调用)。
您可以通过捕获和分析进出您自己的机器和54.x.x.x
的流量来查明阻止您完成 TCP 握手的原因。帮助您解决此问题的最佳工具称为WireShark。祝你好运。
【讨论】:
我已经在上面添加了我的代码,你能检查一下是否有任何可能的错误吗?上面的代码在我的网络中工作正常,可能是因为我的网络非阻塞错误 EINPROGRESS 从未发生过 @user1340512:尝试发布干净完整的代码版本,以便进行测试。 感谢您的回复,我不能在这里发布所有代码,但我只粘贴了失败返回的代码。代码在我们的网络中运行良好(可能是因为在我们的网络中,非阻塞错误永远不会发生并且连接总是成功)。我需要知道的是 EINPROGRESS errno 设置是否高于代码工作正常或在 60 秒之前,abvoe 代码可以返回 -1【参考方案2】:这似乎是connect()的行为:
如果无法立即建立连接并且 O_NONBLOCK 是 为套接字的文件描述符设置,connect() 将失败并且 将 errno 设置为 [EINPROGRESS],但连接请求不得 中止,连接应异步建立。 随后对同一个套接字的 connect() 调用,在 连接已建立,将失败并将 errno 设置为 [EALREADY]。
【讨论】:
我的应用程序是 SFTP,用户创建了许多连接到具有相同端口 22 的同一服务器以上是关于TCP 连接错误 115 Operation in Progress 原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章
服务器22端口连接超时 ssh: connect to host *** port 22: Operation timed out
WRONGTYPE Operation against a key holding the wrong kind of value:类型搞混弄出的错误