socket编程中的异常处理
當(dāng)客戶端與服務(wù)端通過Tcp Socket進(jìn)行通信時,如果客戶端應(yīng)用正常退出或異常退出,服務(wù)端都會在對應(yīng)的連接上獲取感知(如返回0、或拋出異常)。但是,如果客戶端的網(wǎng)線被拔掉,那么,默認(rèn)情況下,服務(wù)端需要在2個小時后才會感知客戶端掉線。對于很多服務(wù)端應(yīng)用程序來說,這么長的反應(yīng)時間是不能忍受的。????
?? 我們通常在應(yīng)用層使用“心跳機(jī)制”來解決類似的問題,這是可行的。?????
?? 然而,在這里,我們可以使用Socket自己的心跳機(jī)制來解決這一問題。 System.Net.Sockets.Socket提供了IOControl()方法給我們來設(shè)置Sokect的心跳機(jī)制的相關(guān)參數(shù)。比如,我們設(shè)置KeepAlive的時間為20秒,檢查間隔為2秒。可以這樣做:
int keepAlive = -1744830460; // SIO_KEEPALIVE_VALS????
byte[] inValue = new byte[] { 1, 0, 0, 0, 0x20, 0x4e, 0, 0, 0xd0, 0x07, 0, 0 }; //True, 20 秒, 2 秒?????
??????????? sock.IOControl(keepAlive, inValue, null);
?? 20秒(20000毫秒)的16進(jìn)制表示是4e20,2秒(2000毫秒)的16進(jìn)制表示是07d0,如此,你可以修改inValue參數(shù)為自己希望的值。????
?? 在上述設(shè)置下,如果撥掉客戶端網(wǎng)線,服務(wù)器Socket.Receive()會在20秒后拋出異常(注意,在這20秒服務(wù)端內(nèi)無論是從該socket上接收消息還是發(fā)送消息都不會拋出異常!)。
總結(jié)
以上是生活随笔為你收集整理的socket编程中的异常处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 待人真诚p2psearcher2013源
- 下一篇: 批处理之备份文件夹