本帖最后由 Toonyxm 于 2010-03-27 18:00:56 编辑

解决方案 »

  1.   

    1.一方的CAsyncSocket 调用 Close 后,可以认为双方之间的Connection就被Close了,但另一方的 CAsyncSocket 不会自动 Close。其实Close()的主要功能是释放socket资源,使之不再有效!补充一点:CAsyncSocket的destructor会在内部调用Close().
    2.一方的程序异常退出后,操作系统会负责清理其占用的资源,包括Socket。所以与1)的情形一致!
    3.OnClose()被触发时,如果参数值不为0,那么就是异常断线了。但这个“触发”与真正的掉线时间之间可能有延迟,默认的最大值好像是4分钟。如果当前应用能接受这个延迟,就没有必要双方周期性互通消息验证了。
    4.只能说是有数据到了,不能保证全部到了。
    5.这个应该是TCP去保证的吧。TCP是可靠连接,如果某个数据包在传输过程中丢失了,发送端会自动重发的。操作系统中的协议栈已经帮你封装好这些东西了,你调用API时基本不需要考虑了。
      

  2.   


    麻烦再问下~ 关于第4个问题.
    怎么做到在OnReceive里当数据完全收到了再Receive()?Create() 参数里的SOCK_STREAM就是基于tcp/ip协议的了吧?
      

  3.   

    对,Create() 参数里的SOCK_STREAM就是表示基于tcp/ip。
    当有数据时,OnReceive就会被触发,所以你只管在OnReceive(){}中调用一次Receive()即可:
    nLength=Receive(szBuffer,sizeof(szBuffer),0);
    nLength是真正读取到的字节数目。
    如果数据没有收取完,OnReceive应该会继续被触发的,这个不需要你“手动”去触发!