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

时间:2012-04-18 06:39:14

标签: c networking tcp network-programming errno

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

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

调用TCP连接时(非阻塞,超时为60秒) 知识产权174.X.X.X总是成功的。 但是,使用ip 54.x.x.x连接到同一服务器的TCP与errno 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;

}

2 个答案:

答案 0 :(得分:19)

根据您的信息:

  • 您正尝试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

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次握手(connect()54.x.x.x IP地址的调用)花费的时间比预期的要长。由于connect()操作已在进行中,因此套接字上的任何后续操作都会导致EINPROGRESS错误代码。根据手册页中的建议,尝试使用select()poll()检查您的套接字是否可以使用(执行read()write()次呼叫)。

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

TCP 3 way handshake

答案 1 :(得分:5)

这似乎是connect()

的行为
  

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