TCP连接错误115正在进行操作原因是什么?

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

  • 174.XXX
  • 54.xxx喜欢这个

当调用TCP连接(非阻塞,超时为60秒)到IP 174.XXX总是成功。 但TCP连接到同一服务器的ip 54.xxx正在失败(大多数时候)正在进行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  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; } 

根据您的信息:

  • 您正在尝试connect()54.xxx
  • 套接字是non-blocking
  • 连接超时为60 sec

首先,如果你查看你的/usr/include/asm-generic/errno.h你会看到以下内容:

 #define EINPROGRESS 115 /* Operation now in progress */ 

这意味着套接字上的现有操作正在进行中。 既然,你说你正在做一个connect()调用,让我们做一个man connect

 EINPROGRESS

套接字是非阻塞的,无法完成连接 
立即。 可以选择(2)或轮询(2)完成
选择套接字进行写入。 选择(2)后表示
可写性,使用getsockopt(2)来读取级别的SO_ERROR选项
 SOL_SOCKET确定connect()是否成功完成
 (SO_ERROR为零)或失败(SO_ERROR是通常的一个
此处列出的错误代码,解释失败的原因)。

因此,最好的猜测是TCP 3次握手(对54.xxx IP地址的connect()调用)花费的时间比预期的要长。 由于connect()操作已在进行中,因此套接字上的任何后续操作都会导致EINPROGRESS错误代码。 正如手册页中所建议的那样,尝试使用select()poll()来检查套接字是否可以使用(执行read()write()调用)。

您可以通过捕获和分析进出自己的计算机和54.xxx的流量来确定阻止TCP握手完成的54.xxx 。 帮助您解决此问题的最佳工具称为WireShark 。 祝好运。

TCP 3路握手

这似乎是connect()的行为:

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