啊啊,我把问题搞复杂了本人菜鸟,说来见笑。。想制作一个心跳包。
被弄了晕头转向,搞了那么复杂。
现在想起来,心跳包的可以这么做:客户端: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 中的元素。

解决方案 »

  1.   

    大致上就是这样的,只不过,服务器端不能用SetTimer来做,这样本质上还是单线程,不能达原本的目的
      

  2.   

    拿怎么办服务端采用线程定时器里如何运行线程呢?能提供个demo嘛
      

  3.   

    看来你还是停留在定时器的问题上了,如果用多线程,定时器很好实现:
    先创建一个事件,然后在子线程中用WaitForSingleObject来等待这个事件,并加上超时,就可以实现定时器效果了,要再简单一点,就直接用Sleep也可实现。
    至于“发送非心跳包数据,就不发送心跳”那更不是问题了,临界区就是用来解决这种问题的。