0

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

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

一个非常重要的说明:相同的代码适用于 win Xp(没有连接时 Connected 属性为 false),但不适用于 win7 并且没有例外。

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

先感谢您。

4

1 回答 1

1

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

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

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

于 2013-05-03T05:07:45.043 回答