iocp是发送和接收共用一个缓冲区吗?
typedef struct
{
OVERLAPPED Overlapped;
WSABUF DataBuf;
CHAR Buffer[DATA_BUFSIZE];
DWORD BytesSEND;
DWORD BytesRECV;
int OperationType;
} PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;
发送和接收共用一个 DataBuf 也就是正在接收数据的时候不能发送,正在发送的时候也不能接收 这样理解对吗?
6 回复
PER_IO_OPERATION_DATA 这是只是结构体定义,这个不叫 “发送和接收共用一个 DataBuf”, 也没法共用。 每个发送或接收操作 关联 的数据都是独立的,但结构都是一样的。
@myy 参考这上面的代码 http://www.cnblogs.com/lidabo/archive/2012/12/10/2812230.html 其中 主线程中 用
PerIoData = (LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_OPERATEION_DATA));
ZeroMemory(&(PerIoData -> overlapped), sizeof(OVERLAPPED));
PerIoData->databuff.len = 1024;
PerIoData->databuff.buf = PerIoData->buffer;
PerIoData->operationType = 0; // read
分配一块结构体内存 工作线程中
LPPER_IO_DATA PerIoData ;
bRet = GetQueuedCompletionStatus(CompletionPort, &BytesTransferred, (PULONG_PTR)&PerHandleData, (LPOVERLAPPED*)&PerIoData, INFINITE);
这两处操作的是不是同一块内存?
是同一块。 GetQueuedCompletionStatus已经返回,说明前一次操作已经完成了,重用这个 PerIoData 没毛病啊~
@myy GetQueuedCompletionStatus 返回只能得到 BytesTransferred 但这个BytesTransferred 有可能是发送的,也可能是接收的,这时候怎么判断是发送成功,还是接收成功呢?
@yakczh 你还是先认真研究下 iocp 的原理吧。网上海了去了。