【问题标题】:C# Socket.Connected property is changed to false after calling Socket.Receive调用 Socket.Receive 后 C# Socket.Connected 属性更改为 false
【发布时间】:2010-11-03 21:44:26
【问题描述】:
int readCount;
byte[] buffer = new byte[128];
SocketError socketError;

TcpClient tcpClient = tcpListener.AcceptTcpClient();
tcpClient.Client.ReceiveTimeout = 500; // #1
// tcpClient.Client.Connected is **true** here.
readCount = tcpClient.Client.Receive(buffer, 0, buffer.Length, SocketFlags.None, out socketError); // reacCount > 0
// tcpClient.Client.Connected is **false** here.

如果将 #1 替换为 tcpClient.Client.Blocking = false;,则 tcpClient.Client.Connected 具有正确的值(true)。


我已将 Socket.ReceiveTime 属性设置为 100 并调用了 Socket.Receive()Receive() 返回大于零的整数值。没有发生异常。 在我使用复制的缓冲区完成工作之后——我没有使用任何与 Socket 相关的方法——Socket.Connected 属性已更改为 false。 为什么?

【问题讨论】:

  • 你检查过 SocketError 吗?

标签: c# sockets


【解决方案1】:

关键可能在于TcpClient.Connected 的真正作用:

Connected 属性获取 客户端套接字的连接状态 截至上次 I/O 操作。当它 返回 false,客户端套接字是 要么从未连接,要么没有 连接时间更长。

因为只有 Connected 属性 反映连接的状态 在最近的操作中,您 应该尝试发送或接收 消息以确定当前 状态。消息发送失败后, 此属性不再返回 true。 请注意,此行为是设计使然。 您无法可靠地测试 连接是因为,在那个时候 在测试和发送/接收之间, 连接可能已丢失。 您的代码应该假设套接字是 连接,优雅地处理 传输失败。

因此,当您没有阻塞时,当您检查 Connected 值时,可能读取尚未完成,因此 Connected 仍处于旧值。

【讨论】:

    【解决方案2】:

    如果远程主机不再连接到套接字,则可能会发生这种情况。连接的另一端是否存在可能已超过的超时?

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 2017-11-29
      • 2020-07-06
      • 1970-01-01
      相关资源
      最近更新 更多