我使用完成端口处理客户端接收数据得时候,只接收不发送,一切数据都是正常得。
但是,当我加入发送得功能得时候,这时如果接收得缓冲区小于发送文件得长度,我接收得数据就是不正常得(乱吗,但是接收得数据长度是正确得),不知你们有没有碰到这种情况?struct ClientContext
{ CRITICAL_SECTION   SockCritSec;
    SOCKET m_Socket; char m_strAddr[20];
// Store buffers
CBuffer m_ReadBuffer;
CBuffer m_WriteBuffer; // Input Elements for Winsock
WSABUF m_wsaInBuffer;
BYTE m_byInBuffer[4194304 // Output elements for Winsock
WSABUF m_wsaOutBuffer;
BYTE m_byOutBuffer[64]; HANDLE m_hWriteComplete;
ClientContext* m_pWriteContext;
ClientContext* m_pReadContext;};
这是我定义得用于代表连接节点得数据体

解决方案 »

  1.   

    从你的结构中看不出什么问题,不知你的乱码是什么意思,在使用完成端口时:注意在一个时间点上,对同一的socket的recv和send操作最好只有一个,即不要在没拿到result时,再对同一socket进行重复操作。
      

  2.   

    VCSQLVB(九龙.君威) 代码??很长,你想看哪部分?
     lifengice0706(无)我在发送和接收之前先要获得这个锁CRITICAL_SECTION   SockCritSec;
      

  3.   

    CRITICAL_SECTION   SockCritSec;兄弟,有点猛哦。一个连接就给一个CRITICAL_SECTION呀?
      

  4.   

    sodme(大宝) 我看《Windows网络编程》是这样处理得 goodboyws(深夜不眠者) ( )怎么才能处理数据覆盖?怎么可以知道是数据覆盖?
      

  5.   

    个人认为逻辑的串行比加锁强。我以前做了个完成端口的例子,包括tcp和udp的接收和发送,唯一的忠告是:当处理有结构的数据流时,一定要提供缓冲区,并设计完整的处理来解包。多测试就行了。
      

  6.   

    谢谢kugou123(酷狗)(http://www.xiaozhou.net)得建议,不过现在协议已经定下来了,无法再更改,呵呵……
    诚如goodboyws(深夜不眠者)所说:我得接收顺序产生了数据覆盖,所以会出现错误!谢谢你们得帮助