15

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

  • 174.XXX
  • 54.xxx 像这样

当调用 TCP 连接(非阻塞,超时 60 秒)到 IP174.X.X.X 总是成功。但是使用 ip 连接到同一台服务器的 TCP 连接54.x.x.x 失败(大多数情况下),errno 115 measn 操作正在进行中。

你能解释一下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;

}
4

2 回答 2

24

根据您的信息:

  • 你正试图做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

进展

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

因此,最好的猜测是 TCP 3 次握手(您connect()54.x.x.xIP 地址的调用)花费的时间比预期的要长。由于该connect()操作已经在进行中,因此对套接字的任何后续操作都会导致EINPROGRESS错误代码。按照手册页中的建议,尝试使用select()poll()检查您的套接字是否准备好使用(执行read()write()调用)。

您可以通过捕获和分析进出您自己机器的流量和54.x.x.x. 帮助您解决此问题的最佳工具称为WireShark。祝你好运。

TCP 3 次握手

于 2012-04-18T07:23:54.193 回答
10

这似乎是connect()的行为:

如果无法立即建立连接并且为套接字的文件描述符设置了 O_NONBLOCK,则 connect() 将失败并将 errno 设置为 [EINPROGRESS],但连接请求不应中止,并且应异步建立连接。在建立连接之前,对同一套接字的后续调用 connect() 将失败并将 errno 设置为 [EALREADY]。

于 2012-04-18T06:48:17.453 回答