C#socket通信时,怎样判断socket双方是不是断开连接
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#socket通信时,怎样判断socket双方是不是断开连接相关的知识,希望对你有一定的参考价值。
语言:C# 问题:在socket通信时,怎么样判断socket双方是否断开连接 我在Server端new了一个socket,然后bind,开了一个线程来accept前来连接的client,每接到一个client前来连接就新开一个线程和它进行通信。 我把Server端得到的socket放到一个集合里,我想知道集合里的socket是否断开连接,如果断开连接我就把它从这个集合里移除。 判断socket是否断开连接,网上有N种说法: 1.Socket.Connected 这个属性只能说明上一次通信时还是正常的。 2.Socket.Pool 这个方法是可以,但是它要从socket里读或写部分数据,如果其他线程从这个socket读写数据,那么数据将会出错。我在写一个远程通信软件时候就出现这个问题了。 而且http://technet.microsoft.com/zh-cn/system.net.sockets.socket.poll.aspx上这样说的: 此方法不能检测某些类型的连接问题,例如,网络电缆中断或远程主机意外关闭。您必须尝试发送或接收数据以检测这些类型的错误。 3.使用心跳包 每隔一段时间,socket一方向另一方发送一段特殊的数据,socket的另一方接到这个数据后回发回来。这样就能判断socket两方都没有掉线了。 请问:还有没有解决方案能快速准确判断socket双方是否断开连接? 如果您有解决方法,且测试成功,请不吝赐教,十分感谢。 如果您不能解决此问题,请不要回复,谢谢合作。
双方发送心跳信号就好了,空闲下来就发送,成功代表还在连接中,连续几个心跳都不成功说明已经失败了 参考技术A 我开了两个QQ测试,比如一个是A,一个是B,A和B是好友,A点击离线,B几乎是同时显示A下线了。但是A被我用任务管理器给结束进程了,B还是显示A在线,过了一段时间才显示A掉线了。所以,我觉得还是用心跳包比较好,每隔一段时间对集合里的socket进行通信,如果没有接到回复超过一段时间,就认为它下线了。Windows Socket网络编程学习笔记一
作者:朱金灿
如何理解Windows Socket?
我的理解:Windows Socket相当于Windows平台上两个网络实体开辟的一条通信通道,这条通信通道的实现细节对网络双方是不可见的(呵呵,你就知道它是Windows制造)。通过这条通道,网络双方可以传输各种数据。
你可能急不可待地问这条通道是怎样开辟的呢?下面我以服务器段和客户端作为网络双方进行说明。
这样你看明白了吗?服务器和客户端之间的连接实际上是服务器端Socket和客户端Socket之间的连接。那么在程序中具体如何呢?实际上很简单,就是在服务器端程序创建一个Socket类对象,在客户端程序创建一个Socket类对象,然后把连接、数据传输等网络通信等工作交给他俩去做。
了解了Socket通信模型,你是不是觉得Windows Socket网络编程不像想象中那么难呢?然后你可以去了解MFC中的Socket类CAsyncSocket和CSocket类的用法,建议你重点看看那篇《Windows Sockets: Socket Notifications》以及下面的
• Windows Sockets: Using Class CAsyncSocket
• Windows Sockets: Deriving from Socket Classes
• Windows Sockets: How Sockets with Archives Work
• Windows Sockets: Blocking
• Windows Sockets: Byte Ordering
• Windows Sockets: Converting Strings
其实MFC中的Socket类和CWnd类有一点是相似的,就是有一些消息激发函数。你需要理解什么条件下这些函数会响应。最后我建议你看懂《Windows Sockets: Socket Notifications》的例程(点击Sample链接),那是一个简单的聊天程序,这对理解Socket很有好处(我就是从那得到启发的)。
以上是关于C#socket通信时,怎样判断socket双方是不是断开连接的主要内容,如果未能解决你的问题,请参考以下文章