如果我把客户断的网线拔掉,
服务器端如何知道客户端已经断开了?请各位高手们给个想法,
有想过有心跳包的方式,但是不知道怎么做、
能不能给个参考的代码?
也有试过直接调用sendTimeOut和receiveTimeOut
但是好像都没用处!急,不懂的也帮我顶一顶,凡顶者皆有5分。
回答者依据帮助情况给分!谢谢啦!
送完为止
服务器端如何知道客户端已经断开了?请各位高手们给个想法,
有想过有心跳包的方式,但是不知道怎么做、
能不能给个参考的代码?
也有试过直接调用sendTimeOut和receiveTimeOut
但是好像都没用处!急,不懂的也帮我顶一顶,凡顶者皆有5分。
回答者依据帮助情况给分!谢谢啦!
送完为止
1.自己用Socket写心跳包,自己写比较繁琐,复杂,容易出错,不建议
2.其实.Net的Socekt本身就提供了KeepAlive,利用Socket.IoControl函数设置KeepAlive,可以实现心跳包,详细的方法可以参考这篇文章http://blog.csdn.net/wzd24/archive/2007/10/12/1821360.aspx,这是我建议的方法我最近也在做一个TCP相关的项目,利用第二种方法很好的解决了心跳包的问题有兴趣的可以邮件相互讨论 [email protected]
p2p需要打洞,但好像不是所有的路由器都支持tcp吧,我记得以前看过一本书说是只有70%支持。
应该用udp吧
有其他邮件地址没?
什么时候网络有可能出现阻塞,也认为客户端已经断开连接吗?
而且我的底层,也就是所谓的客户端其实就是一块电路板的芯片在处理!不是软件~实现起来也挺麻烦!再者我用的是P2PSocket通信,总感觉这东西用起来特别麻烦。
一点都不熟悉这么个P2PSocket通信,哎当初网络这部分就不应该交给其他人做,现在很费劲!但是又不想重新做~
我自己的做法是这样的,这是我自己写的函数
/// <summary>
/// KeepAlive心跳包
/// </summary>
/// <param name="sock"></param>
/// <param name="onOff">开启关闭检测,1开启,0关闭</param>
/// <param name="keepALiveDelay">检测前的等待时间</param>
/// <param name="keepALiveInterval">检测的时间间隔</param>
public void KeepAlive_Timer(Socket sock, int onOff, int keepALiveDelay, int keepALiveInterval)
{
try
{
uint dummy = 0;
byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
BitConverter.GetBytes((uint)onOff).CopyTo(inOptionValues, 0);
BitConverter.GetBytes((uint)keepALiveDelay).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
BitConverter.GetBytes((uint)keepALiveInterval).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);
sock.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
}
catch (Exception err)
{
throw new Exception(err.Message);
} }对于服务器端的Socket,在每次Accept到一个接入的Socket时,要对该Socket设置一次
我用的是异步的Accept,在回调函数里面设置Socket的KeepAlive
列:
private void OnConnectRequest(IAsyncResult ar)
{
Socket listener = (Socket)ar.AsyncState;
Socket client = new Socket(listener.EndAccept(ar), this);
KeepAlive(client,1, 15000, 5000);
//其他代码
listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
}