[C#]关于事件驱动的SOCKET类的优化

来源:互联网 发布:hill climbing 算法 编辑:程序博客网 时间:2024/05/29 16:29

在上一篇《[C#]事件驱动的SOCKET类》的文章中,地址:http://blog.csdn.net/much0726/archive/2009/06/25/4296789.aspx,我简单写了一个客户端的SOCKET连接类,并将接收的数据通知到SOCKET事件和数据包事件中,由于本人经验的不足,在数据判断上出现一些问题,原来写的文章中,我也会注明下本篇对其进行的进一步修改:

不能将socket.Poll(-1, SelectMode.SelectRead)方法作为判断SOCKET是否可以读的标准,此方法不能检测某些类型的连接问题,例如,网络电缆中断或远程主机意外关闭。您必须尝试发送或接收数据以检测这些类型的错误。在CSDN的论坛上也有人指出这个问题了,并且在微软的MSDN上也有权威的解释:http://technet.microsoft.com/zh-cn/system.net.sockets.socket.poll.aspx.

我原来的代码在服务器上运行一段时间后(大概1天左右),会出现接收不到SOCKET数据的情况,我就在判断前后加上了日志跟踪,果然是这个方法判断上出了问题。在C#写的接收数据方法上并不需要多余的判断,只要直接使用socket.Receive()即可,如果接收的字节数为0或者抛出SocketException异常,就可以判断网络连接是否断开了。下面是修改后的代码:

 

 

小结

线程通知到上层事件后,外部事件挂接后,可以直接进行委托BeginInvoke(),在委托的方法中就可以直接操作界面控件了。

原创粉丝点击