【问题标题】:How to detect a connection failure in Indy TCP Client如何在 Indy TCP Client 中检测连接失败
【发布时间】:2021-12-28 09:39:45
【问题描述】:

我在 C++Builder 11 Alexandria 中使用 Indy TIdTCPClientTIdTCPServer 创建了一个客户端和一个服务器。

我可以启动服务器并将客户端正确连接到它,但是如果我将服务器 MaxConnections 设置为值 N 并尝试使用 N+1 客户端连接到它,连接不会失败,显然。

例如:我在服务器中设置MaxConnections=1,第一个客户端连接到它并引发服务器OnConnect事件,而在客户端OnStatus事件中我收到两条消息:

message 1: Connecting to 10.0.0.16.
message 2: Connected.

我尝试连接第二个客户端:服务器 OnConnect 事件未引发(这是我所期望的)但在客户端 OnStatus 事件中我收到相同的两条消息(这不是我所期望的):

message 1: Connecting to 10.0.0.16.
message 2: Connected.

然后,第一个客户端可以与服务器交换数据,而第二个客户端不能(这似乎是正确的)。

我不明白为什么第二个客户端连接没有明确失败,我做错了什么吗?

【问题讨论】:

  • 您所描述的内容对MaxConnections=1 有意义,而不是2。使用MaxConnections=2,您应该能够同时与 2 个客户端连接和通信
  • @Remy - 你说得对,我已经更正了帖子

标签: c++ c++builder indy10


【解决方案1】:

你没有做错任何事。这是TIdTCPServer正常行为

操作系统级别1没有跨平台套接字API来限制TCP服务器上活动/接受连接的数量套接字,仅用于限制服务器积压中的挂起连接数。该限制由TIdTCPServer::ListenQueue 属性处理,默认情况下为15(但这与其说是硬限制,不如说是一个建议,如果需要,底层套接字堆栈可以覆盖它)。

因此,TIdTCPServer::MaxConnections 属性的实现方式是简单地接受来自 backlog 的任何尝试连接的客户端,然后如果超过 MaxConnections 限制,则立即断开该客户端。 p>

因此,如果您尝试将更多的客户端连接到 TIdTCPServer 而不是 MaxConnections 允许的,这些额外的客户端将不会看到任何连接失败(除非积压已满),但服务器不会触发 OnConnect为他们举办的活动。从客户端的角度来看,它们实际上确实连接成功,它们被服务器的底层套接字堆栈完全接受(TCP 3way 握手完成)。但是,它们只是在尝试与服务器实际通信之前不会处理断开连接,然后它们会检测到断开连接,通常以EIdConnClosedGracefully 异常的形式(但不能保证)。

1:仅在 Windows 上,有一个 WSAAccept() 函数,它有一个回调,可以在挂起的连接离开积压队列之前拒绝它们。但是此时 Indy 并没有使用这个回调。

【讨论】:

  • 感谢您的解释,现在我更了解发生了什么
【解决方案2】:

不同的 TCP 堆栈表现出不同的行为。您的描述与 TCP 堆栈一致,该堆栈只是忽略对已达到挂起和/或已接受连接的最大配置限制的套接字的 SYN:SYN 数据包只是被丢弃在地板上并且未被确认。

TCP 的本质是它应该处理网络丢包。发件人不会立即退出,但会在一段时间内继续尝试连接。这部分与所有 TCP 实现一致。

如果您希望您的客户端在某个设定的时间段内没有建立的连接快速失败,您需要自己实现手动超时。

【讨论】:

  • 感谢 Sam 的回答,很清楚。最好调用 TcpClient->Connect() 直到我收到 EIdAlreadyConnected 异常(已建立连接)或超时(未建立连接)?
  • 某事是否是“好主意”完全取决于您想做什么。您应该从每次调用中清楚地指示连接是否成功。如果确实如此,那么再次调用它就没有多大意义,只是为了抛出一个异常。您的连接已建立。
  • 这个答案有很好的信息,但不是在这种特殊情况下发生的事情。这个答案描述了当服务器积压填满挂起的连接时会发生什么。请参阅我的答案以获得替代解释。
猜你喜欢
  • 2011-06-13
  • 2014-05-16
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 2014-11-22
  • 2013-11-17
相关资源
最近更新 更多