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 。 祝好运。
这似乎是connect()的行为:
如果无法立即建立连接并且为套接字的文件描述符设置了O_NONBLOCK,则connect()将失败并将errno设置为[EINPROGRESS],但不应中止连接请求,并且应异步建立连接。 在建立连接之前,对同一套接字的connect()的后续调用将失败并将errno设置为[EALREADY]。