日期:2014-05-20  浏览次数:21071 次

使用非阻塞send 0字节的方法无法判断socket连接。
如题,那是msdn上介绍的方法。我的服务程序启动专门线程负责监听端口,并处理新的socket连接数据。现在的问题是,我客户端使用shutdown+close断开了,但是服务程序中的socket的connected属性一直为true,send   0字节总是成功,没有异常。如果可以及时判断连接丢失的话,我就可以直接在主线程中接收和发送数据。而现在我要启动专门的线程来处理新的socket连接,当客户端断开时阻塞式的receive函数会直接返回0,我就可以直接close了。大侠们有啥高招指点一下呢?

------解决方案--------------------
客户端安全断开的时候可以给服务端发送一个特殊字符通知客户端将要断开,如果是客户端异常断开(断电,断网),只能自己写心跳程序来检测了
------解决方案--------------------
'当客户端断开时阻塞式的receive函数会直接返回0,我就可以直接close了 '
有道理,干嘛不。
------解决方案--------------------
msdn所说的,并没有什么问题。
现在.net提供的socket类功能比较大,它包含了TcpListener和TcpClient这两个类的功能。

你可以拆开来理解,
服务器先用TcpListener监听网络端口,遇到新的请求创建新的Socket对象进行通信;
客户端用TcpClient连接远程服务器,然后在此基础上用Socket对象进行通信。

所以如果你只用socket一个类来完成,显得有些混淆,但是效果是一样的,即有个socket对象要起到TcpListener或者TcpClient对象的作用。
------解决方案--------------------
使用 这个判断一下 if (socket.Poll(2000,SelectMode.SelectRead))