c - TCP 连接错误 115 Operation in Progress 是什么原因?

标签 c networking tcp network-programming errno

我的应用程序创建了一个 TCP 连接,它工作正常。 但是在一个网络服务器中有多个 IP 说

  • 174.X.X.X
  • 54.x.x.x 像这样

调用 TCP 连接时(非阻塞,超时 60 秒) IP 174.X.X.X 总是成功的。 但是 TCP 使用 ip 54.x.x.x 连接到同一台服务器失败(大多数时候)错误号为 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;

}

最佳答案

根据您的信息:

  • 您正在尝试对 54.x.x.x
  • 执行 connect()
  • 套接字是非阻塞
  • 连接超时为 60 秒

首先,如果您查看您的 /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 次握手(您对 54.x.x.x IP 地址的 connect() 调用)花费的时间比预期的要长完全的。由于 connect() 操作已经在进行中,因此套接字上的任何后续操作都会导致 EINPROGRESS 错误代码。按照手册页中的建议,尝试使用 select()poll() 来检查您的套接字是否已准备好使用(以执行 read()write() 调用)。

您可以通过捕获和分析进出您自己的机器和 54.x.x.x 的流量来查明阻止 TCP 握手完成的原因。帮助您解决此问题的最佳工具称为 WireShark .祝你好运。

TCP 3 way handshake

关于c - TCP 连接错误 115 Operation in Progress 是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10204134/

相关文章:

Windows 无法绑定(bind)到 49690 以上的端口

c - 如何在特定区域画圆?

c - 哈希表删除方法

c - Lua C API : pushing function with lua_pushcfunction isn't working

linux - 我如何开始制作我自己的简单的基于 UNIX 的网络扫描仪?

http - 为什么我收不到来自支持 TCP/IP 的打印机的响应?

powershell - 如何使用powershell检查端口是否正在使用

c - 输入不足

python - 禁用 Python 中的 Plotly 以任何形式与网络通信

docker - NGINX/Docker-Compose/Phoenix