在完成端口中我投递了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???只有这么多分了
但是我判断传输的字节数量发现,有的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???只有这么多分了
解决方案 »
- 什么原因CMFCPropertyGridCtrlValue每次Create都返回false
- 使用CFileDialog时,有没有什么办法控制可进入的路径
- 怎么做一个中央监护系统那样的界面?
- ONMOUSEWHEEL事件
- vtk问题之二,解决马上结帖,up有分!
- 请教:CArray<CPoint,CPoint> m_pointArray;有什么错误?
- 真的没人知道吗?监视一个目录及其子目录下的文件有无发生变化的问题。
- 关于WS_POPUP的问题,谢谢
- 从系统服务启动程序,怎么使程序处在当前用户下?
- 如何屏匿手按键盘的消息,只允许发自扫描器的消息?
- 怎么让一个程序一开机就启动?
- 关于: 直方图问题
--------------------------------------
错误代码是多少?将SendBuffer中的数据未发的部分重发的时候,会不会被新的投递过来的WSASend将SendBuffer中的数据冲掉??
---不会
错误代码是多少?是10055
将SendBuffer中的数据未发的部分重发的时候,会不会被新的投递过来的WSASend将SendBuffer中的数据冲掉??
---------------------
看你怎么处理了
而且 这种情况下要等上一个包发送完毕 才能发送下一个包 不然在应用层数据会乱
再有 我还没遇见过WSASend只发送成功一部分数据的情况
你的意思是投递一个,再判断被投递的是否成功,成功了再投递第二个??
关于
将SendBuffer中的数据未发的部分重发的时候,会不会被新的投递过来的WSASend将SendBuffer中的数据冲掉??
你回答的不会,但是我感觉我WSASend和GetQueuedCompletionStatus之后的时候都用的同一个BUFFER啊。肯定可能会冲掉。你能解释一下吗?
char SendBuffer[DATA_BUFSIZE];
char RecvBuffer[DATA_BUFSIZE];
每个PER_IO_OPERATION_DATA结构要有SendBuffer RecvBuffer各一个这样互不干扰