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)
M
PER_IO_OPERATION_DATA 这是只是结构体定义,这个不叫 “发送和接收共用一个 DataBuf”, 也没法共用。 每个发送或接收操作 关联 的数据都是独立的,但结构都是一样的。
Y
引用 myyPER 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);
这两处操作的是不是同一块内存?
M
是同一块。 GetQueuedCompletionStatus已经返回,说明前一次操作已经完成了,重用这个 PerIoData 没毛病啊~
Y
引用 myy是同一块。 GetQueuedCompletionStatus已经返回,说明前一次操作已经完成了,重用这个 PerIoData 没毛病啊
@myy GetQueuedCompletionStatus 返回只能得到 BytesTransferred 但这个BytesTransferred 有可能是发送的,也可能是接收的,这时候怎么判断是发送成功,还是接收成功呢?
M
引用 yakczh@myy GetQueuedCompletionStatus 返回只能得到 BytesTransferred 但这个BytesTransferred 有可能是发送的,也可能是接收的,这时候怎么...
@yakczh 代码中写的和很明白啊:
PerIoData->operationType = 0; // read
专门定了个operationType标识
M
引用 yakczh@myy GetQueuedCompletionStatus 返回只能得到 BytesTransferred 但这个BytesTransferred 有可能是发送的,也可能是接收的,这时候怎么...
@yakczh 你还是先认真研究下 iocp 的原理吧。网上海了去了。
参与回复
登录后即可参与回复。登录