iocp是发送和接收共用一个缓冲区吗?
发布于 5 年前 作者 yakczh 2827 次浏览 来自 问答
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 代码中写的和很明白啊:

PerIoData->operationType = 0; // read

专门定了个operationType标识

@yakczh 你还是先认真研究下 iocp 的原理吧。网上海了去了。

回到顶部