网络编程中多个线程同时发起多个接受调用的问题

cppabc 2018-06-01 01:13:24
有个问题想和大家讨论下,在iocp编程模型中,如果有多个IO线程,其中一个线程一次投递多个recv操作那等到有数据到达时应该是只有次线程在getqueuedcompletionstats中会返回吧,也就是相应的投递通知只能相应的发送请求的线程得到通知,我的理解没错吧
...全文
1049 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cppabc 2018-06-05
  • 打赏
  • 举报
回复
没有人能够回答吗
cppabc 2018-06-04
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
《Windows核心编程》
不要让我看书,如果你看过的话可以直接回答我的问题嘛
赵4老师 2018-06-04
  • 打赏
  • 举报
回复
《Windows核心编程》
赵4老师 2018-06-04
  • 打赏
  • 举报
回复
引用 8 楼 cppabc 的回复:
[quote=引用 4 楼 zhao4zhong1 的回复:] 百度搜“HP-SOCKET”
你的回答可看可不看,以后建议你不要在其他人的帖子中回答问题[/quote] https://bbs.csdn.net/topics/392372284
cppabc 2018-06-04
  • 打赏
  • 举报
回复
引用 11 楼 youyingbo 的回复:
如果对方分多次发数据,接收方也是先投递一个recv请求,在回调函数里接收第一包数据,然后再投递下一个recv请求,接收第二包数据
你说的这种情况也可以正确处理数据,我说的情况和你是不一样的,同一个套接字上多个请求
tiger波波 2018-06-04
  • 打赏
  • 举报
回复
如果对方分多次发数据,接收方也是先投递一个recv请求,在回调函数里接收第一包数据,然后再投递下一个recv请求,接收第二包数据
tiger波波 2018-06-04
  • 打赏
  • 举报
回复
引用 9 楼 cppabc 的回复:
[quote=引用 6 楼 youyingbo 的回复:] iocp编程模型中不存在多次投递recv请求的情况吧?第二次及以后的recv应该接收不到东西
当然不是了,除非后面没有数据了[/quote] 我说的不存在多次投递recv请求指的是多次连续的投递recv请求 都是先投递一个recv请求,数据到达后,进入回调函数,回调函数里收取到所有的数据后,根据个人的需求,要么发送一条数据给对方,然后再投递recv请求,准备接收下一组数据,要么进行其他操作。 如果对方和你没有交互,源源不断的发数据,那么还是只需要投递一个recv请求,在这个recv请求的回调函数里收取所有的数据,socket不会发送一包数据,给你发送多个“数据已经到达”的消息的。
cppabc 2018-06-04
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
百度搜“HP-SOCKET”
你的回答可看可不看,以后建议你不要在其他人的帖子中回答问题
cppabc 2018-06-04
  • 打赏
  • 举报
回复
引用 5 楼 smwhotjay 的回复:
iocp任意线程投递异步recv, 任意线程都可以getqueuedcompletionstats 来获取完成通知消息。
谢谢你的回答,之前也看过你在其他帖子回答过这方面的问题。这个问题通过查找资料确实是你说的这种情况不是我理解的那样,但我现在还有一个问题,对与一个或多个io操作系统能保证他们按照操作的顺序完成,但为什么接受通知的时候不一定能按操作的顺序收到通知呢
cppabc 2018-06-04
  • 打赏
  • 举报
回复
引用 6 楼 youyingbo 的回复:
iocp编程模型中不存在多次投递recv请求的情况吧?第二次及以后的recv应该接收不到东西
当然不是了,除非后面没有数据了
tiger波波 2018-06-04
  • 打赏
  • 举报
回复
iocp编程模型中不存在多次投递recv请求的情况吧?第二次及以后的recv应该接收不到东西
smwhotjay 2018-06-04
  • 打赏
  • 举报
回复
iocp任意线程投递异步recv, 任意线程都可以getqueuedcompletionstats 来获取完成通知消息。
cppabc 2018-06-02
  • 打赏
  • 举报
回复
没有人能够回答吗,还是没有人能很好的理解IOCP的机制,大家可以探讨啊
cppabc 2018-06-01
  • 打赏
  • 举报
回复
有个问题想和大家讨论下,在iocp编程模型中,如果有多个IO线程,其中一个线程一次投递多个recv操作那等到有数据到达时应该是只有发送相应投递调用的线程在getcopstats中会返回吧(即使另一个线程也做了相同的操作),也就是相应的投递通知只能相应的发送请求的线程得到通知,比如A线程发送投递接受对方的前10k的数据此时另一个线程在同一个套接字上再发送接受发送者后15k数据的recv调用(假设A线程先投递完成,B线程后投递完成,且都处于pend状态),那等完成队列中有数据后第一个先满足A线程的请求,即使只有少于10k的数据到达。然后A 中getqueuedcompletionstats返回,紧接着投递下一个recv,此时线程B的recv请求还没有收到数据。等过一会后有数据了,此时在调用getqueuedcompletionstats的A B两个线程只有B才能收到数据并返回,即使此时A是在运行中的状态。我的理解没问题吧

18,356

社区成员

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

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