社区
网络编程
帖子详情
有关完成端口连续多次投递的问题。
smzgl
2009-06-12 10:12:05
如果连续多次投递事件,假设是写事件。那么完成端口有会返回多个完成通知。这些通知会不会分散在多个线程当中呢?
...全文
95
8
打赏
收藏
有关完成端口连续多次投递的问题。
如果连续多次投递事件,假设是写事件。那么完成端口有会返回多个完成通知。这些通知会不会分散在多个线程当中呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
songtao_01
2009-06-15
打赏
举报
回复
如果连续多次投递事件,假设是写事件。那么完成端口有会返回多个完成通知。这些通知会不会分散在多个线程当中呢?
会,所以要做好同步
songtao_01
2009-06-13
打赏
举报
回复
[Quote=引用 4 楼 crst_zh 的回复:]
对于多次投递,如果每个完成通知之后再发送一个请求,那么相当于单线程在处理,并不能很好的提高性能。
可以这样:
一次投递多个请求,让cpu同时工作,问题在于WSARecv()的参数
int WSAAPI WSARecv ( SOCKET s,
LPWSABUF lpBuffers,//这个参数可以利用
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPINT lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETI…
[/Quote]
还觉得还有个问题,你接收的时候如果没接到一个完整的PER_IO_OPERATION_DATA数据,怎么解决.打个比方比如ABC是一个数据,DEF是另一个数据.接到的数据可能是CDABEF,怎么重新组合起来呢.或者会不会产生前面所说情况.
crst_zh
2009-06-12
打赏
举报
回复
[Quote=引用 2 楼 mfc168 的回复:]
一次写,就是一次通知
工作线程query的时候,Event为Write
你接收缓冲大小可以自己调整,但是必须为循环接收,才能接收完全
[/Quote]
多谢!这下我也清楚了。
mfc168
2009-06-12
打赏
举报
回复
一次写,就是一次通知
工作线程query的时候,Event为Write
你接收缓冲大小可以自己调整,但是必须为循环接收,才能接收完全
crst_zh
2009-06-12
打赏
举报
回复
如果连续投递,那么会在队列中有好几个未决请求,每一个未决请求最终会有一个对应的完成通知。这些通知会分散在多个线程中。
考虑这样的一个情况:一次投递的包>发送缓冲区,例如发送1000字节,但是缓冲区大小只是400,那么一次投递时间会产生3个完成通知。
我的理解,欢迎高手指正。
rularys
2009-06-12
打赏
举报
回复
[Quote=引用 1 楼 crst_zh 的回复:]
如果连续投递,那么会在队列中有好几个未决请求,每一个未决请求最终会有一个对应的完成通知。这些通知会分散在多个线程中。
考虑这样的一个情况:一次投递的包>发送缓冲区,例如发送1000字节,但是缓冲区大小只是400,那么一次投递时间会产生3个完成通知。
我的理解,欢迎高手指正。
[/Quote]
一次成功的投递只会有一次完成通知。
crst_zh
2009-06-12
打赏
举报
回复
对于多次投递,如果每个完成通知之后再发送一个请求,那么相当于单线程在处理,并不能很好的提高性能。
可以这样:
一次投递多个请求,让cpu同时工作,问题在于WSARecv()的参数
int WSAAPI WSARecv ( SOCKET s,
LPWSABUF lpBuffers,//这个参数可以利用
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPINT lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );
typedef struct
{
OVERLAPPED Overlapped;
WSABUF DataBuf;
CHAR Buffer[DATA_BUFSIZE]; //接收缓冲
DWORD BytesSEND; //发送字节数
DWORD BytesRECV; //接收字节数
DWORD Sesuence; //序号
} PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;
我们是不是可以建立一个数组比如PER_IO_OPERATION_DATA PIOD[1000]
每一个重叠请求编上序号,那么每次请求的时候,第2个参数直接根据序号指向数组的相应位置,那么多个线程(多CPU计算机)同时工作,各自填写自己对应的那部分,比如:请求序号为100,则自动填写PIOD[100]的部分,请求序号为102,则自动填写PIOD[102]的部分,这样对于完成通知,可能102号结束的更早,但是没有影响,数组里面的结果自然有序。
马上测试,欢迎大家指正。
用
完成
端口
搭建自己的网络应用服务
最近常看见关于
完成
端口
的讨论,对其实现颇为好奇,于是经过多日
连续
奋战,终于对
完成
端口
进行了完整封装,这里谈谈我搭建的架构模型。 设计思路: 一、系统分为工作线程,AcceptEx
投递
线程,处理线程,资源回收线程四类线程 1.1、工作线程若干个,用于处理网络事件方面工作,如处理:客户端接收工作,数据接收 后进行简单的分包并加入到请求包队列中,数据发送完毕后负责检查是否发送 完毕,
IOCP中
多次
投递
WSASend
https://blog.csdn.net/zy100/article/details/6205204关于IOCP中是否可以对同一socket
连续
投递
的疑问已经很久了,主要的疑问在wsaSend是否可以保证数据的完整发送,是否会出现部分发送成功的情况? 网上大多数的建议都是WSASEND采用线性模式,即建立一个发送缓冲,当上一次send
完成
之后,再进行下一次的
投递
。那么WSASEND什么...
Winsock
完成
端口
模型简介
摘自《Networking Programming for Microsoft Windows》第八章“
完成
端口
”模型是迄今为止最为复杂的一种I/O模型。然而,假若一个应用程序同时需要管理为数众多的套接字,那么采用这种模型,往往可以达到最佳的系统性能!从本质上说,
完成
端口
模型要求我们创建一个Win32
完成
端口
对象,通过指定数量的线程,对重叠I/O请求进行管理,以便为已经
完成
的重叠I/
完成
端口
(IOCP)编程探讨
本文主要探讨一下windows平台上的
完成
端口
开发及其与之相关的几个重要的技术概念,这些概念都是与基于IOCP的开发密切相关的,对开发人员来讲,又不得不给予足够重视的几个概念: 1) 基于IOCP实现的服务吞吐量 2)IOCP模式下的线程切换 3)基于IOCP实现的消息的乱序
问题
。 一、IOCP简介 提到IOCP,大家都非常熟悉,其基本的编程模式,我就不在这里展开了。在这里我主要
关于IOCP
完成
端口
这个PostQueuedCompletionStatus函数运用
问题
PostQueuedCompletionStatus( HANDLE CompletionPort, DWORD dwNumberOfBytesTransferred, ULONG_PTR dwCompletionKey, LPOVERLAPPED lpOverlapped ) 关于这个函数,网上几乎都是......经常用于退出时发送一个模拟的IO...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章