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)
{
......
}
...全文
220 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kwer 2015-08-31
  • 打赏
  • 举报
回复
我是这么理解的,如果这个客户端的socket已经注册到了IOCP,你的想法就基本没法摆脱的,除非解除绑定。
小竹z 2015-08-14
  • 打赏
  • 举报
回复
引用 1 楼 yaozhiyong110 的回复:
你不想把send动作加到iocp 那你WSASend后面2个参数都传0啊 还要什么OVERLAPPED?
你没明白我的意思,我的意思是仍然采用异步来发送数据,只不过发送成功后,iocp不用通知我,即GetQueuedCompletionStatus不用返回io事件通知。
yaozhiyong110 2015-08-14
  • 打赏
  • 举报
回复
你不想把send动作加到iocp 那你WSASend后面2个参数都传0啊 还要什么OVERLAPPED?
shenyi0106 2015-08-14
  • 打赏
  • 举报
回复
WSASend的参数中有个回调函数,可以设置此回调函数,在完成后,将会通知你的回调函数,不会通知完成端口。
yaozhiyong110 2015-08-14
  • 打赏
  • 举报
回复
引用 2 楼 zgxyz2010 的回复:
[quote=引用 1 楼 yaozhiyong110 的回复:] 你不想把send动作加到iocp 那你WSASend后面2个参数都传0啊 还要什么OVERLAPPED?
你没明白我的意思,我的意思是仍然采用异步来发送数据,只不过发送成功后,iocp不用通知我,即GetQueuedCompletionStatus不用返回io事件通知。[/quote] 你这要求很搞笑了 iocp的机制就是异步调用 完成后GetQueuedCompletionStatus收到通知上层处理 你要减少处理 你的拓展OVERLAPPED结构后面加上个标记 GetQueuedCompletionStatus判断这个标记不处理不就完了
xian_wwq 2015-08-14
  • 打赏
  • 举报
回复
引用 2 楼 zgxyz2010 的回复:
[quote=引用 1 楼 yaozhiyong110 的回复:] 你不想把send动作加到iocp 那你WSASend后面2个参数都传0啊 还要什么OVERLAPPED?
你没明白我的意思,我的意思是仍然采用异步来发送数据,只不过发送成功后,iocp不用通知我,即GetQueuedCompletionStatus不用返回io事件通知。[/quote] 不通过GetQueuedCompletionStatus获取返回的事件通知, 如何判定异步操作是否成功呢?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧