在完成端口中我投递了WSASend后用GetQueuedCompletionStatus得到了完成的消息。
但是我判断传输的字节数量发现,有的WSASend没投递的很成功,于是我就把BUFFER的指针重新指向未投递成功的那部分BUFFER。但是总是失败,我知道肯定是我的数据结构设计的有问题!typedef enum _tagIO_OPERATION 
{
    ClientIoAccept,
    ClientIoRead,
    ClientIoWrite
} IO_OPERATION, *PIO_OPERATION;
typedef struct _tagPER_IO_OPERATION_DATA
{
   OVERLAPPED Overlapped;
   WSABUF DataBuf;
   char Buffer[DATA_BUFSIZE];
   IO_OPERATION OperationType;
   int State;
   DWORD RecvBytes;//只表示投递接受未成功的字节数,成功完成后全部清0
   DWORD SendBytes;//只表示投递发送未成功的字节数,成功完成后全部清0
} PER_IO_OPERATION_DATA, * PPER_IO_OPERATION_DATA;我想问的是在我的PER_IO_OPERATION_DATA结构体中,一个   char Buffer[DATA_BUFSIZE];
够了吗?是否该给WSASend和WSARecv都分配一个???假如WSASend和WSARecv都各有一个,如下
char SendBuffer[DATA_BUFSIZE];
char RecvBuffer[DATA_BUFSIZE];
我在GetQueuedCompletionStatus后假如发现该WSASend未发送的很完整。我
将SendBuffer中的数据未发的部分重发的时候,会不会被新的投递过来的WSASend将SendBuffer中的数据冲掉??(每个SOCKET都只有一个结构体)
如果这样的话我该怎么做?难道是为每个投递的WSASend都分配一个BUFFER???只有这么多分了

解决方案 »

  1.   

    但是我判断传输的字节数量发现,有的WSASend没投递的很成功,于是我就把BUFFER的指针重新指向未投递成功的那部分BUFFER。但是总是失败
    --------------------------------------
    错误代码是多少?将SendBuffer中的数据未发的部分重发的时候,会不会被新的投递过来的WSASend将SendBuffer中的数据冲掉??
    ---不会
      

  2.   

    但是我判断传输的字节数量发现,有的WSASend没投递的很成功,于是我就把BUFFER的指针重新指向未投递成功的那部分BUFFER。但是总是失败
    错误代码是多少?是10055
      

  3.   


    将SendBuffer中的数据未发的部分重发的时候,会不会被新的投递过来的WSASend将SendBuffer中的数据冲掉??
    ---------------------
    看你怎么处理了
    而且 这种情况下要等上一个包发送完毕 才能发送下一个包 不然在应用层数据会乱
    再有 我还没遇见过WSASend只发送成功一部分数据的情况
      

  4.   

    fengge8ylf() ( ) 信誉:98 
    你的意思是投递一个,再判断被投递的是否成功,成功了再投递第二个??
      

  5.   

    gohappy_1999(碧水蓝天) ( ) 信誉:100 
    关于
    将SendBuffer中的数据未发的部分重发的时候,会不会被新的投递过来的WSASend将SendBuffer中的数据冲掉??
    你回答的不会,但是我感觉我WSASend和GetQueuedCompletionStatus之后的时候都用的同一个BUFFER啊。肯定可能会冲掉。你能解释一下吗?
      

  6.   

    一般的做发是当一个连接进来的时候new一个PER_IO_OPERATION_DATA结构  然后用CMap或CList保存
    char SendBuffer[DATA_BUFSIZE];
    char RecvBuffer[DATA_BUFSIZE];
    每个PER_IO_OPERATION_DATA结构要有SendBuffer RecvBuffer各一个这样互不干扰