[TCP] CAsyncSocket::OnSend有什么用?我的CMyAsyncSocket sock来于CAsyncSocket,::send(sock, buf, bufSize, 0)和OnSend如何配合使用?甚是迷惑!

解决方案 »

  1.   

    CAsyncSocket类内部建有一个窗口,每个创建的Socket都使用WSAAsyncSelect置入异步方式。随后,当有数据到达的时候,内建的窗口上会收到一条消息。该消息经MFC消息回路处理之后最终调用OnReceive。
    至于OnSend,那是每当套接口由不可写变成可写的时候(缓冲区的数据已经发得差不多了),在内建的窗口上收到另一条消息之后,由MFC调用的。
    而send是socket api,可以直接发送数据,具体可见《windows网络编程》
      

  2.   

    至于OnSend,那是每当套接口由不可写变成可写的时候(缓冲区的数据已经发得差不多了),在内建的窗口上收到另一条消息之后,由MFC调用的。
    ===============================================
    不可写变成可写的时候 / 是CAsyncSocket一直在检查?发现可写就 OnSend ?我的程序中在sock(CAsyncSocket类的)上用api发数据 ::send(sock, buf, bufSize, 0),可能一个也发不出,由CAsyncSocket检查可发再OnSend,再OnSend再::send(sock, buf, bufSize, 0)?可以这么做吗?
      

  3.   

    OnSend()只不过是系统缓冲区(socket内部的缓冲区可用的时候)
    有CAsyncSocket的回调函数自动检测出,系统缓冲区可以自己设置
    大小,也可以不用系统缓冲区直接发送:
    int nZero=0;
    setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
    setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(nZero));
    这样当你主动调用send()的时候是一定能成功的! 其实OnSend() 这个东东在写代码
    的时候用的很少(最好不用),发送OnSend()的时候也不只是系统缓冲区可用时候发出.