当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。
若使用了select等系统函数,若远端断开,则select返回1,recv返回0则断开。其他注意事项同法一。
设置后,若断开,则在使用该socket读写时立即失败,并返回ETIMEDOUT错误
法五:
自己实现一个心跳检测,一定时间内未收到自定义的心跳包则标记为已断开。
上面所说的方法,是直接利用winsock API编程时用的方法,如果用System.Net,可以这样来获得所accept的客户端的IP地址:TcpClient client = myListener.EndAcceptTcpClient(ar)
IPAddress clientIP =((IPEndPoint)(client.Client.RemoteEndPoint)).Address
你可以用一个数组来保存各个已经连接的clientIP,在接受连接时进行判断,如果这个IP已经连接了,则拒绝接受连接。
拒绝接受连接的方法:
if (HaveBeenAccpeted(clientIP)) // 如果这个IP已经连接了{NetworkStream networkStream = client.GetStream()
networkStream.Close()// 马上断开这个TCP连接
socket建立连接失败会抛出异常,你只需要在catch里捕捉异常就可以了catch(exception e)
{
System.out.println("服务器/客户端未连接")
return
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)