【问题标题】:socket keepalive works with xp but not with windows 7 c#socket keepalive 适用于 xp 但不适用于 windows 7 c#
【发布时间】:2013-04-28 08:04:09
【问题描述】:

我有一个奇怪的问题: 我有一个 TcpClients 列表,当其中一个断开连接时需要通知我。 当他们每个人都被初始化时,我将他们的套接字设置为 keepalive(setsocketoption 和 iocontrol),它似乎没有任何问题(没有例外)。

比我有一个单独的线程来检查每个 TcpClient 其 Socket 的 Connected 属性。 问题是,即使 ip 不再连接(例如我断开网络电缆),布尔值仍然为真(已连接)。 我尝试将代码更改为 (socket.available == true) && socket.poll(1, socketMode.selectread) 而不做任何更改。

非常重要的一句话: 完全相同的代码适用于 win Xp(没有连接时 Connected 属性为 false),但不适用于 win7 并且没有异常。

我以管理员身份运行程序并且禁用了防火墙。

提前谢谢你。

【问题讨论】:

    标签: c# sockets connection disconnect


    【解决方案1】:

    Connected 布尔值在发送或接收操作失败之前为真。这就是 TCP/IP 的本质。因此,例如,如果您有一个从计算机 A 连接到 B 的套接字,然后拔下计算机 B 上的网络电缆,则计算机 A 不会报告套接字已断开连接,直到您下次尝试发送一些数据时。

    我建议实施某种 ping/pong 机制,每隔 n 次(例如 5 秒)发送一次以查看另一端是否还活着。

    我不知道为什么您的测试显示它在 XP 和 Windows 7 上有所不同,我原以为没有区别。也许在 XP 上碰巧您在拔下触发Connected 设置为假的电缆后发送了一些数据?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多