怎么判断对方已经关掉套接字?
写了一个简单的聊天程序,程序就差判断用户是否下线这一块儿了;
服务器监听之后
socket1=accept(m_socket,(SOCKADDR*)&addrecv,&len1);
我想通过判断socket1的状态从而判断用户是否在线。各位有什么好的方法吗?如果要用socket模型,我的程序是不是得变很大?不用的话有什么其他判断的方法吗?
[解决办法]
你肯定写有接收该客户端的接口吧(即:::recv(socket1))。该函数的返回值就能够判断对方是否关闭。我记得是返回0时,表示对方是通过closesocket(socket1)的方式关闭了该套接字。如果返回-1的话,就需要使用getlasterror()来抓取到底是什么原因导致接收失败了。
大体上就可以通过if(0 >= ::recv(socket1))来判断通信是否关闭了。
[解决办法]
你说的是异步通信,你绑定的是哪个套接字,就是哪一个了。
[解决办法]
send返回0表示对方关闭了
或者采用心跳包的方式,定时判断。
[解决办法]
长连接:心跳包是最科学的方法,一般都是自定义协议,在一段时间内发送一小端消息过去。
一般服务器对每个连接都有个定时器,比如60秒之内收不到消息,服务器自动判定已断线,做相关处理
短连接:这个判断就要重新Connect了,不需要心跳包