我使用的是CAsyncSocket,现在的实现是这样的,在Mainframe有个pLink的指针,
在CSocketLink::OnReceive()时,将this赋给pLink,这时在Mainframe下操作pLink可以正常的返回数据给客户端。当有其他客户端发送数据过来,Mainframe下的pLink又会被替换掉发送其他的数据。请问,这种设计方案合适吗?还有,我用的是TCP长连接,如果突然拔网线或者断电,这时双方是不知道socket已经close掉的,那么服务端会一直保存着这个socket,这时候该如果检测呢?如果用定时器,岂不是每个客户端都得设置一个定时器定期检查,要是客户端多了,定时器的数据不就很夸张?

解决方案 »

  1.   

    觉得还是用winsock API去写比较好,非阻塞IO模型都可以嘛
      

  2.   

    不太懂mfc得socket类,不过都是一样的accept的时候生成一个与客户端通信的socket,然后保存起来,这样保存的每一个socket都代表一个客户端防止断线可以使用心跳包,客户端定时给服务器发心跳消息,服务器保存下每个客户端的上次发送数据的时间,并另开一个线程定时检查所有客户端,如果时间与当前时间差达到一个预定的值,就认为该客户端已经断开了连接
      

  3.   


    “开一个线程检查所有客户端”,是指定时遍历一下所有已经连接到服务端的socket么?
      

  4.   


    定时器不需要为每个客户端都开,基本上开一个枚举所有socket超时状态就可以了
      

  5.   

    不知道我理解的对不对?CAsyncSocket会根据客户端的IP地址和端口号自动识别是哪个客户端发来的请求信息,
    你只要把IP和端口号做一个组合存到map里即可,
    收到客户端请求时查询map。
      

  6.   

    至于“突然拔网线或者断电”,
    我猜测CAsyncSocket一定有超时机制,超时后执行OnClose函数。
    去查一下MSDN吧或在百度里搜索一下
      

  7.   

    多个线程共用一个pLink?  数据会串吧。