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

EINPROGRESS 套接字是非阻塞的,无法完成连接 立即地。可以通过 select(2) 或 poll(2) 完成 选择要写入的套接字。 select(2) 后表示 可写性,使用 getsockopt(2) 读取级别的 SO_ERROR 选项 SOL_SOCKET 判断 connect() 是否成功完成 (SO_ERROR 为零)或不成功(SO_ERROR 是常见的一种 此处列出的错误代码,说明失败的原因)。

因此,最好的猜测是 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 原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

查看tcp连接情况

115 - 进程实例 04

linux查看TCP各连接状态

服务器22端口连接超时 ssh: connect to host *** port 22: Operation timed out

WRONGTYPE Operation against a key holding the wrong kind of value:类型搞混弄出的错误

ActionScript 3.0 套接字无法重新连接