关于如何取消socket与完成端口的关联???

seveneleven 2005-11-25 09:04:01
//当把一个socket关联到完成端口,并调用WSARecv后:
while(1)
{
bRet = GetQueuedCompletionStatus(m_MainFrm->CompletionPort,
&BytesTransferred,
(PULONG_PTR)
&PerHandleData,
(LPOVERLAPPED*)
&PerIoData,
INFINITE);
/*如果下边再多次调用WSARecv或WSASend的话。GetQueuedCompletionStatus就会被多次激活。我不希望这种事情的发生。所以当第一次激活后,我就想关闭该socket与完成端口的关联。以便于下边进行我自己的一些交互操作。不知道如何取消该socket与完成端口的关系呢。请高手指点一二。谢谢*/
}
...全文
925 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
seveneleven 2005-12-07
  • 打赏
  • 举报
回复
没。我只是用的closesocket,我再试试closehandle
seveneleven 2005-12-06
  • 打赏
  • 举报
回复
我用DuplicateHandle,复制一个句柄,然后呢,把关联到IOCP的那个socket用closesocket关闭掉,但是,好像并没有关闭掉,完成端口仍然能够接收我关闭掉的那个socket的数据,是不是因为我复制了句柄的原因?
vc_asm 2005-12-06
  • 打赏
  • 举报
回复
那没法了,你是用CloseHandle吗?

seveneleven 2005-12-05
  • 打赏
  • 举报
回复
不过,我提问的原来的意思的确跟楼上的 vc_asm(哥俩好) 说的差不多。先试这个。看行不。:)
seveneleven 2005-12-05
  • 打赏
  • 举报
回复
不错不错。
peibosys(重庆小代)
windbells(风铃)
vc_asm(哥俩好)

这三种方法都值得一试。我试试去,看来几天没来了,收获不小。
周江涛 2005-12-02
  • 打赏
  • 举报
回复
closesocket,有连接来了,再创建一次,也没多大开销的。。
大菠菜 2005-12-02
  • 打赏
  • 举报
回复
mark
windbells 2005-12-01
  • 打赏
  • 举报
回复
实际上没必要取消,用完成端口实现更高效一些,如果真是复杂的操作,可以考虑用完成端口结合其他的方式来实现,比如加上任务队列,线程池这些。
不过如果非要想屏蔽掉消息的话,你可以创建一个事件对象
m_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
然后把你的WSARecv或WSASend里用到的
OVERLAPPED对象的结构成员
hEvent值设置成
ovOut.hEvent=(HANDLE)((DWORD)hEvent | 0x1);
这样调用WSARecv或者WSASend的消息就不会投递到完成端口上
DoItFreely 2005-12-01
  • 打赏
  • 举报
回复
还是用重叠IO吧,完成端口真是一个似是而非的解决方案。还是期待linux下的epoll能稳定一点(使用了one shot模型,老是崩溃):
ZHENG017 2005-12-01
  • 打赏
  • 举报
回复
pls try cancelio.
vc_asm 2005-12-01
  • 打赏
  • 举报
回复
哥们,我知道答案了,但是我一气你的贴子看光了啊,正累啊
目前我也在网络通信的,贴子在这里,你也来说两句吧
http://community.csdn.net/Expert/topic/4428/4428750.xml?temp=.0958063
现在我告诉你答案,你的意思我明白了,你是想要用IOCP的时候,用IOCP,不想用的时候,从IOCP中取出来,后来又想要IOCP了,又加进去,而你的socket又是一直可用是吧,好,我满足你的奢侈的欲望:)
要加入IOCP的方法,不说你也知道,如何从IOCP里取出来呢,哈哈,你用DuplicateHandle,复制一个句柄,然后呢,把关联到IOCP的句柄关掉,不就OK?
zdleek 2005-12-01
  • 打赏
  • 举报
回复
mark
peibosys 2005-11-30
  • 打赏
  • 举报
回复
引用楼主:因为我在测试的时候,好像不管是WSARecv WSASend都会激活GetQueuedCompletionStatus这个函数。害得我分不清到底是发送,还是接收了。

类似:
struct OverEx//扩展重叠结构
{
OVERLAPPED overlap;
WSABUF wsaBuff;
char buff[8192];
......
};

struct KeyData //单句柄数据结构
{
SOCKET socket;
OverEx *lpSendOV;
OverEx *lpRecvOV;
};
对WSASend和WSARecv投递不同的重叠结构,单句柄数据结构记下套接字句柄
和WSASend和WSARecv的重叠结构指针就行了

工作线程内一般如下处理
OverEx *PerIoData;
KeyData *PerHandleData;
........
bRet = GetQueuedCompletionStatus(m_MainFrm->CompletionPort,
&BytesTransferred,
(PULONG_PTR)
&PerHandleData,
(LPOVERLAPPED*)
&PerIoData,
INFINITE);
...........
if(PerIoData == PerHandleData->lpSendOV)//说明是响应WSASend
{
......
continue;
}
if(PerIoData == PerHandleData->lpRecvOV)//说明是响应WSARecv
{
.......
}

你想撤消套接字与完成句柄绑定完全没有必要,你在需要继续接收数据时再投递WSARecv就行了
seveneleven 2005-11-30
  • 打赏
  • 举报
回复
因为我在测试的时候,好像不管是WSARecv WSASend都会激活GetQueuedCompletionStatus这个函数。害得我分不清到底是发送,还是接收了。或许我用法有问题?所以我才想着要连接之后就取消这个SOCKET与完成端口的关系了。当然,如果我能控制哪个WSARecv或WSASend可以不激活GetQueuedCompletionStatus这个函数的话,我肯定就一直用完成端口了。
liuwei200000 2005-11-30
  • 打赏
  • 举报
回复
UP
蓄丰 2005-11-30
  • 打赏
  • 举报
回复
马上要用,关注
freemme 2005-11-26
  • 打赏
  • 举报
回复
引用楼主:自己的一些交互有些复杂,不能写在工作线程中啊。因为这些交互信息很多,并且有不可预知性[比如可能要传文件,也可能要聊天,也可能执行命令,或是其它的一些东东]。

楼主,你首先要获得交互信息才能进行交互处理吧,这些交互信息应该是要从原先建立的socket收取的吧(否则这个连接就没有存在的必要了),那这些信息为什么不能通过完成端口来获取呢?获取信息后,你就可以根据信息的格式,调用相应的处理函数(自己定义的)来完成交互了。
不知道我是否理解了楼主的意思?
seveneleven 2005-11-25
  • 打赏
  • 举报
回复
关闭连接哪能行呢。因为以后还要对这个SOCKET做大量的交互操作。做完成端口的目的就是为了响应大规模的连接请求,但连接过后,就不用完成端口了,需要用我自己的一些交互,所以才有了这个要求。不过,我试试CreateIoCompletionPort(s,NULL,NULL,NULL)。因为为了考虑效率。所有的数据传输都是基于异步方式的,所以没办法直接改成send recv 。
dingpiao 2005-11-25
  • 打赏
  • 举报
回复
关闭连接
nuaawenlin 2005-11-25
  • 打赏
  • 举报
回复
CreateIoCompletionPort(s,NULL,NULL,NULL)试试
加载更多回复(17)
完成端口通讯服务器(IOCP Socket Server)设计 (六)功能强大的IOCP Socket Servre模块例程源码 Copyright © 2009 代码客(卢益贵)版权所有 QQ:48092788 源码博客:http://blog.csdn.net/guestcode 一、声明 版权声明: 1、通讯模块代码版权归作者所有; 2、未经许可不得全部或部分用于任何项目开发; 3、未经许可不得部分修改后再利用源码。 免责声明: 1、 由于设计缺陷或其它Bug造成的后果,作者不承担责任; 2、未经许可的使用作者不提供任何技术支持服务。 权利和义务: 1、任何获得源码并发现Bug的个人或单位均有义务向作者反映; 2、作者保留追究侵权者法律责任的权利。 二、开发背景 部分代码由前项目分离而来,尚未有应用考验,但对于初学者学习和进阶有很大帮助。性能上尚未有定论,但应该不会令你失望。 三、功能说明 1、可以关闭Socket的Buffer; 2、可以关闭MTU(不等待MTU满才发送); 3、可以多IP或多端口监听; 4、可以重用socket(主动关闭除外); 5、可以0缓冲接收(Socket的Buffe = 0时,避免过多的锁定内存页); 6、可以0缓冲连接(客户端仅连接,不一定立即发数据); 7、可以条件编译: a、是否使用内核Singly-linked lists; b、是否使用处理线程(工作线程和处理线程分开); c、是否使用内核锁来同步链表。 8、可以实现集群服务器模式的通讯(有客户端socket); 9、可以单独设置每个连接的Data项来实现连接和Usernfo的关联; 10、每个线程有OnBegin和OnEnd,用于设置线程独立的对象(数据库会话对象); 11、可以提供详细的运行情况,便于了解IOCP下的机制,以及进行调试分析; 12、可以发起巨量连接和数据(需要硬件配置来支持)。

18,355

社区成员

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

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