啊啊,我把问题搞复杂了本人菜鸟,说来见笑。。想制作一个心跳包。
被弄了晕头转向,搞了那么复杂。
现在想起来,心跳包的可以这么做:客户端:class CMsg
{
public:size_t type; //类型:心跳包?数据?size_t size; //发送的内容的大小char buff[MAX];time_t time; //发送时间char id[20]; //客户端id
};界面是一个对话框void CMyDialog::OnTimer(,) //30秒发送一次
{客户端socket.send(心跳包结构体);}
服务端:class CMsg //和客户端一样
{
....};监听socket,与客户端通信的socket.std::map<与客户端通信的socket,最后一次发送数据给服务器的时间(可以使心跳包也可以是非心跳包> socketMap;
服务端收到客户端发送的数据后,立即去socketmap中查找,有该socket的话,则进行更新时间。如果没有,则插入到map中。
服务端也需要开一个定时器,进行轮训socketmap. 如果轮训的时候,服务器的时间减去客户端最后一次更新的时间差 》超时时间,则认为客户端已经断线,那么删去 map 中的元素。
先创建一个事件,然后在子线程中用WaitForSingleObject来等待这个事件,并加上超时,就可以实现定时器效果了,要再简单一点,就直接用Sleep也可实现。
至于“发送非心跳包数据,就不发送心跳”那更不是问题了,临界区就是用来解决这种问题的。