初学CAsyncSocket,我试Send了一个包,然后立刻调用了Receive函数等待服务器反应数据,结果什么数据都没有收到,后来我在Send与Receive中加了一个Sleep(1000)就可以收到返回数据了,所以有些困惑1.Receive是不是读取一个类似于队列数据结构,就是如果我过一段时间不调用,但是已经有很多数据包发进来了,我再调一下,Receive到的是最先进来的一个包还是,全部我没有读取的包一下子进我的变量,还是什么其他情况?2.如果要弄成同步的,是否是要写一个类继承于CAsyncSocket然后重载他的OnReceive函数?3.一般与服务器交流是用怎么一种开发模式?因为Send后不是立即Receive到数据,所以Send后直接Receive不可行顺便再问一个网络问题:用TCP 3次握手后如果我不和服务发送其他数据,是立即会断开呢,还是要等一段时间,大概要等多久?问题比较多,回答的都有分,麻烦各位了,谢谢

解决方案 »

  1.   

    1. CAsyncSocket 不分包,Receive 时候返回指定长度的数据。
      

  2.   

    2. CAsyncSocket Send 并没有立即发送,应该是在 OnSend 函数里才开始发送。接收应该是在 OnReceive 函数里接收。
      

  3.   

    回楼上:
    1.那么收进来的数据就是都已经先放在一个缓存里了,然后就等我用Receive来收了对吗?这个缓存有多大呀?
    2.那就是要我弄一个CAsyncSocket的继承重载OnReceive对吗?
      

  4.   

    发送函数
    Sendxxxx()
    {
        AsyncSelect(FD_WRITE | FD_CLOSE);
    }OnSend()
    {
        Send();
        AsyncSelect(FD_READ | FD_CLOSE);
    }
    接收
    OnReceive()
    {
        Receive();
        AsyncSelect(FD_READ  | FD_CLOSE);
        CAsyncSocket::OnReceive(nErrorCode);
    }
      

  5.   

    缓冲区大小可以设置的,可能是 setsockopt 函数里有吧,记不清了。
    用 CAsyncSocket 就应该重载 OnConnect, OnClose, OnSend, OnReceive
      

  6.   

    连接后要过一个超时值,没有数据发送/接收才会断开,超时应该也有设置,不过我不知道。
    好象设置 KEEP_ALIVE 也不行。
      

  7.   

    .h
    virtual void OnReceive(int nErrorCode);.cpp
    void CClientSocket::OnReceive(int nErrorCode) 
    {
    }
      

  8.   

    CAsyncSocket是非阻塞方式的,也就是说你调用Receive后它会立即返回,可能有数据,也可能没有数据!
    CSocket是阻塞方式的。调用Receive后他会一直等待直到有数据过来才返回。如果你用CAsyncSocket的话,建议设一个循环,反复读取,如无数据continue继续。如有则处理!另外TCP连接后,不和服务发送其他数据不是立即会断开。它会一直连接的。据体多长时间可能会断开我也没试过。
      

  9.   

    另外如果用同步的可以用CSocket
      

  10.   

    同步用CSocket,CAsyncSocket是异步,可以循环来判断是否有数据
    TCP建立连接后,会有一个超时定时器,2MSL等时间发生状态转移