iocp中如何将WSASend完成通知不加入完成队列?
小竹z 2015-08-14 09:25:18 RT。根据windows核心编程上说可以将WSASend完成通知不添加到完成端口队列中,即GetQueuedCompletionStatus不处理WSASend通知。我原本做法是WSASend在投递时在堆上分配一个OVERLAPPED对象,该对象在GetQueuedCompletionStatus中释放,现在我将OVERLAPPED分配在栈上,测试没有问题。
1.难道iocp在内部锁定了传入的OVERLAPPED内存?否则在线程函数返回时栈上内存就释放了额?
2.OVERLAPPED中数据存放内存是在堆上分配的,OVERLAPPED(扩展了该结构)析构函数中会释放该内存,测试表明内存并没有增长,析构函数被调用了?
3.如果我做法有问题,那么该怎么实现该功能呢?我想减少对WSASend通知处理来提供性能。
代码如下:
PER_IO_DATA pData; //该结构对是对OVERLAPPED扩展,你懂的!
pData.buffer=pBuffer; //pBuffer是new出来的,该结构析构函数会delete[]
pData.data.buf=pData.buffer;
pData.data.len=ilen;
pData.type=IO_SEND;
DWORD dSend=0;
if(WSASend(soc,&(pData.data),1,&dSend,0,&(pData.ol),NULL)==SOCKET_ERROR)
{
......
}