昨天用自己的代码“暴力测试”Tcp C/S 的模式,修修改改之后倒是可以顺利运行:服务器能够收到客户端的连接和发送,客户端可以联机到服务器并发送数据,崩溃出现在客户端“断开”部分。客户端运行 BeginDisconnect 之后,服务器的独立线程的 While 循环部分立即出现“死循环”,用来显示状态信息的 ListBox 被快速添加刷新,不明白这是为什么呢?从 CodeProject 下载了一个 Tcp/IP 的程序,看到对方的服务器端代码,也是大同小异。
1. 通常做法,是先 Bind 绑定,然后 Listen,紧跟着在 While(true) 循环中使用 Accept 等待。这一系列过程被写在一个方法内,但使用独立线程运行以防止界面冻结。
2. MSDN 上的一段话很有用:
备注
Connected 属性获取截止到最后的 I/O 操作时 Socket 的连接状态。当它返回 false 时,表明 Socket 要么从未连接,要么已断开连接。
Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。
如果调用用户数据报协议 (UDP) 套接字上的 Connect,则 Connected 属性始终返回 true;不过,此操作不更改 UDP 的内在无连接特性。