社区
网络编程
帖子详情
完成端口在用WSASend发送数据的时候,到底是已经发送完了还是只进入完成端口线程操作?
lyzcom
2004-09-13 12:23:10
我不太明白,当用上了完成端口之后,我WSASend一个数据,这个时候,该函数是立刻返回,仅将数据包交给完成端口线程去再发送,还是他已经将数据发送完成或一部分已经发送完了?
这个概念我一直都没弄清楚。
...全文
216
3
打赏
收藏
完成端口在用WSASend发送数据的时候,到底是已经发送完了还是只进入完成端口线程操作?
我不太明白,当用上了完成端口之后,我WSASend一个数据,这个时候,该函数是立刻返回,仅将数据包交给完成端口线程去再发送,还是他已经将数据发送完成或一部分已经发送完了? 这个概念我一直都没弄清楚。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
large_small
2004-09-13
打赏
举报
回复
帮你UP一下
gdy119
2004-09-13
打赏
举报
回复
WSASend()只不过是投递一个动作要求操作系统开线程
去处理I/O操作,也就是WSASend()只不过是将系统缓冲
区的类容copy到socket的缓冲区 ,等到具体的操作完成
可以调用wsagetoverlapped()得到I/O是否完成!
DentistryDoctor
2004-09-13
打赏
举报
回复
检查发送的字节数,如果小于需要发送的字节数,如果交给后者WSAGetLastError会返回WSAEWOULDBLOCK。
IO
完
成
端口
简单案例,很简单,以看就会
一个很简单的
完
成
端口
案例,大家可以一起探讨。这里配合客户端测试。在TCP的协议下,
完
成
端口
的模型基本上是以下这种模式: 主
线程
| CreateIoCompletionPort | CreateThread —————————
完
成
端口
线程
| | |---- While(TRUE) While(TRUE)----------| | | | | | Accept |------GetQueuedCompletionStatus() | | | | | | | CreateIoCompletionPort | WsaRev/W
saS
end
-------| | | | | |----WsaRev/W
saS
end
|------------ Windows系统 | | Windows系统 --------- 主
线程
主要负责接受客户端的连接,在侦听到客户端的连接以后,将异步接受数据,由
操作
系统通知 GetQueuedCompletionStatus函数获取
操作
。在这里Accpet和GetQueuedCompletionStatus函数都是处于阻塞模式。这种TCP模式的
完
成
端口
比较容易理解,但是在UDP协议下的实现就比较难于考虑,他没有Accept的阻塞,主
线程
比较难于处理。如果没有这个主
线程
,WsaRecfrom函数又不知道放在哪里才能够通知GetQueuedCompletionStatus得到相应的
操作
方式。因此,希望大家能够帮我考虑一下,这种UDP下的
完
成
端口
该怎么安排他的结构?
网络编程-
完
成
端口
源码
步骤一,创建一个
完
成
端口
步骤二判断有多少个处理器 步骤三:根据处理器的数量创建工作
线程
,本例当中,工作
线程
的数目和处理器数目是相同的 步骤四:创建监听套接字 步骤五,接入Socket,并和
完
成
端口
关联 步骤六 创建一个perhandle结构,并和
端口
关联 步骤七,接入套接字和
完
成
端口
关联 步骤八 开始进行I/O
操作
,用重叠I/O
发送
一些W
SAS
end
()和WSARecv()
代码客:G-Socket(IOCP) 1.0 (Server/Client)例程源码+Server体验程序+强大的压力测试工具
结构层次及相互联系 (1)、工作
线程
:响应连接的IO投递返回并负责投递读请求,并将IO返回结果投递给处理
线程
,可设定参数决定工作
线程
数量; (2)、处理
线程
:处理
线程
调用回调函数将信息传递给应用层或协议栈,可设定参数决定工作处理数量; (3)、看守
线程
:响应Accept事件调用AcceptEx,检测连接和心跳超时 ,将信息投递给工作
线程
,模块仅有一个看守
线程
。 1. 技术要求 (1)、
线程
同步:Lock指令、临界段; (2)、主要Socket API:W
SAS
end
、WSARecv、AcceptEx、DisconnectEx; (3)、内存管理:连接池(句柄重用)、内存池; (4)、数据0拷贝:通过内置处理
线程
,上层应用可以避免自建
线程
池及复制数据的过程。同时提供GBuf内存分配功能,应用层获得分配地址及填充数据之后亦可直接投递给内核/驱动层; (5)、数据顺序同步:同一个连接同时只有一个处理
线程
响应其IO事件; (6)、IO请求投递:单投递读、多投递写; (7)、0缓冲读投递:可条件编译实现,以适用大规模连接要求。 (8)、超时机制:可设置空连接(连接不
发送
数据
)超时时间以防止DOS攻击,也可设置心跳超时时间防止网络故障导致的现有连接成为虚连接避免耗尽系统资源。 (9)、接口技术:API、回调函数、客户句柄(客户连接句柄)。 (10)、主、被动
发送
:不使用HASH、MAP及LIST技术,即可提供安全可靠高效的客户连接句柄,以实现服务器端主被动
发送
数据
功能; (11)、PerHandleData的回收不以IO投递的计数器或链表来做依据但仍能安全回收,同时尽量避免在高频的读写
操作
时做其他无关的
操作
以提高读写效率。 (12)、处理
线程
和工作
线程
有着良好分工界限,繁重的工作交给处理
线程
完
成
,工作
线程
工作量最大限度的减少,仅响应投递返回及读投递的
操作
; (13)、支持AWE,模块自动识别AWE是否开启(需手动开启),“否”则使用虚拟内存机制。 2. 功能要求 (1)、多IP多
端口
监听,每个监听可设置不同的回调函数,以高效的区别处理数据 (2)、可设置每秒最大的连接并发量和空连接(连接不发数据)超时时间以防止DOS攻击造成的服务瘫痪、具有心跳处理(防网络异常造成的虚连接)功能 (3)、不加协议的透明传输,可适用广泛的网络通讯环境 (4)、可现实主、被动
发送
数据
,但不会因兼顾主动
发送
而额外增加降低效率的工作 (5)、内置处理
线程
,上层应用可不必自建
线程
池处理数据,所有IO事件按顺序调用回调函数并可以在回调函数内直接处理数据,不必担心多
线程
造成的接收数据乱序的问题。 (6)、高效率的数据对应关联机制,在初次连接并根据登录数据设置每个连接对应的宿主(Owner)之后,再接收的数据即可立即获得该连接对应的宿主,而不必再做额外的查询工作,并且模块内部采用的是指针关联方式,对于长连接、主动
发送
的服务器系统而言是高效率的。 (7)、可兼容IPv6 3. 注意事项 因硬件环境和应用环境不同,不合理的配置会出现效率及性能上的问题,因此以下情况出现时,请务必与作者联系以确保获得更好的参数配置: (1)、连接量超过1000个的。超过的应结合具体硬件配置和网络带宽等因素综合设定运行参数。 (2)、带宽使用率超过20%的。工作
线程
和处理
线程
数量的设置也是综合考虑数据吞吐量和数据处理负载的因素来设置的,过多的
线程
会在调度上浪费时间,同时也应该综合考虑
线程
优先级别来设置工作
线程
和处理
线程
数量,两者的设置也不一定能相等。 (3)、服务器端有主动
发送
需求的、短连接(含网络故障造成的连接断开)出现频率高的。 压力测试工具介绍: 一、 使用G-TcpClient模块 二、 可以设定间隔时间发起大规模长、短连接 三、 可以发起密集数据包,包括即时和定时
发送
,1M的光纤带宽最大可以达到100K/S(单向)以上,100M本地网最大可以达到10M/S(单向)以上 四、 数据
发送
仅由一个独立
线程
但当,每点击一次Connect就创建一个
线程
根据当前参数发起连接。 五、 测试前提:服务器接收客户端数据后立即原样返回给客户端
iocp(
完
成
端口
)采用WSARecv W
SAS
end
处理数据,W
SAS
end
群发(广播)消息
最近在耍iocp,也在网上看了不少例子,但却基本没看到使用W
SAS
end
群发的例子 最多只是使用W
SAS
end
将数据回传,而这个功能相对比较简单,只要学会使用WSARecv 回传则比较容易实现,而广播则较难。 一开始我采用的是s
end
将数据群发(广播),这样不需要使用重叠I/O,也较容易的实现了功能, 但没成功使用W
SAS
end
群发消息,心里总有点不舒服,于是慢慢琢磨,最后终于实现
(四)Windows网络模型之
完
成
端口
模型详解
完
成
端口
模型是重叠IO模型的升级版,它解决了重叠IO模型中
线程
过多导致效率下降的问题。 在
完
成
端口
模型中,我们新创建一个
完
成
端口
变量,并将所有的socket(包括服务器socket和客户端通信socket)都绑定到
完
成
端口
上。然后使用AcceptEx()、WSARecv()、W
SAS
end
()函数异步投递相应的任务,等任务
完
成
后
操作
系统将
完
成
通知放进通知队列中。 之后程序员创建合理数目的
线程
,在
线程
函数中取出通知队列的头部,然后分析并分类处理。 该模型所有函数执行部分都是异步的,而且不存在
线程
滥用问题
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章