社区
网络编程
帖子详情
IOCP服务器有很大量数据分成很多包发送,在GetQue线程中投递WSAsend发送,得到结果等于发送数继续发下一条,老是丢数据,请问如何确保发
sdf123321
2006-04-19 10:53:48
如题!!!,请教高手
...全文
600
20
打赏
收藏
IOCP服务器有很大量数据分成很多包发送,在GetQue线程中投递WSAsend发送,得到结果等于发送数继续发下一条,老是丢数据,请问如何确保发
如题!!!,请教高手
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ifeelhappy
2006-09-06
打赏
举报
回复
我把流程说一下,各位老大分析一下:
客户端采用Csocket OnRecice后recv到信息直接写文件,不做其它事情。
服务器端:线程A检测有没有发往客户端的信息,有的话就产生信息写入发送缓冲区a,判断该客户端SOCKET是否正在发送,如没有发送就PostQueuedCompletionStatus(m_hiocp, 0, (DWORD)lpmyio, &lpmyio->pSIOContext->ol); 通知完成端口开始发送数据。
完成端口GetQue返回后就检测发送缓冲区a有没有等待发送的数据,有就取得数据投递WSASend发送,等下次GetQue返回时候判断发送字节是否等于需要发送数据,如确认相等后就继续从发送缓冲区a取下一条投递WSASend发送。
如此循环,单步跟踪,发送10次数据都正常,单正常运行时候,发送2次后在WSASend时候就有WSA_IO_PENDING发生,看了WSASend参数dwBytes的值是一个很大的数,按常理说GetQue完成了才发下一条,系统缓冲不应该还有数据呀,不应该出现WSASend呀,请高手解答。
-----------------------------------------------------------------------------------
我是菜鸟,我来说一下,你看看我的意思.
你发送了,只是说你告诉系统去做这样一个IO操作,系统知道了之后,不一定立刻去做,但是他一定会去做,做完之后还会通知你做完了.这就是完成端口的作用.你发送了之后去看缓冲区肯定是有数据的,而且肯定会经常那个WSA_IO_PENDING错误的.这有什么不对呢?
萧山夜雨
2006-06-22
打赏
举报
回复
硬撑者,这名字好有意思啊。
萧山夜雨
2006-06-22
打赏
举报
回复
这个问题我以前也碰过,
客户端使用delphi的CClientSocket异步方式接完成端口的包时,老是丢,或数据不完整,累计发送 != 累计接收数,后来我使用ClientSocket阻塞方式,就不丢了,但是慢。
再后来试了一下,vc的CSocket用异步方式也不丢数据,并且速度快。6000包,不到1秒就传完了。
CPP2008
2006-06-22
打赏
举报
回复
一定是你代码的问题。
仔细的调试下。
10个包一组,10个包一组的调试。
把服务器的发送流程print出来,自然就清楚了。
sdf123321
2006-04-20
打赏
举报
回复
我把流程说一下,各位老大分析一下:
客户端采用Csocket OnRecice后recv到信息直接写文件,不做其它事情。
服务器端:线程A检测有没有发往客户端的信息,有的话就产生信息写入发送缓冲区a,判断该客户端SOCKET是否正在发送,如没有发送就PostQueuedCompletionStatus(m_hiocp, 0, (DWORD)lpmyio, &lpmyio->pSIOContext->ol); 通知完成端口开始发送数据。
完成端口GetQue返回后就检测发送缓冲区a有没有等待发送的数据,有就取得数据投递WSASend发送,等下次GetQue返回时候判断发送字节是否等于需要发送数据,如确认相等后就继续从发送缓冲区a取下一条投递WSASend发送。
如此循环,单步跟踪,发送10次数据都正常,单正常运行时候,发送2次后在WSASend时候就有WSA_IO_PENDING发生,看了WSASend参数dwBytes的值是一个很大的数,按常理说GetQue完成了才发下一条,系统缓冲不应该还有数据呀,不应该出现WSASend呀,请高手解答。
sdf123321
2006-04-19
打赏
举报
回复
另外我调用WSAsend时,有时候会返回WSAGetLastError() = WSA_IO_PENDING 的阻塞错误,并且WSAsend返回的发送字节数dwSendNumBytes为随机值,我投递WSAsend是在上一个GetQue返回后才投递的呀,怎么还会有WSA_IO_PENDING错误,难道GetQue返回了发送字节数等于wsasend的发送字节数的时候,SOCKET的系统发送缓冲还没有发送完?怎么还会阻塞,不应该呀?郁闷!!
sdf123321
2006-04-19
打赏
举报
回复
我用telnet测试的
gohappy_1999
2006-04-19
打赏
举报
回复
接收端的问题吧
sdf123321
2006-04-19
打赏
举报
回复
在线等待!!!在线结贴!!!
sdf123321
2006-04-19
打赏
举报
回复
TO:striking(硬撑者):
服务器端分10000个包,每个包都有编号,在GetQue线程中投递WSAsend发送,在GetQue中得到发送字节数等于发送数,继续投递下一个WSAsend发送,依次循环,全部发送完后,结果客户端收到的全部数据小于服务器发送的数据?不知流程是否有问题,请指点,谢谢!!
striking
2006-04-19
打赏
举报
回复
描述不够清楚.
老是丢数据: 你指的是发送的时候丢数据,还是客户端接收的时候数据不完整.
tcp发送不会丢数据的. 代码问题大.
sdf123321
2006-04-19
打赏
举报
回复
可就是查不出问题
sdf123321
2006-04-19
打赏
举报
回复
有道理
pripor
2006-04-19
打赏
举报
回复
这种情况丢包
一般是程序本身的问题
fengge8ylf
2006-04-19
打赏
举报
回复
按楼主说的很合理啊 不应该丢包 是不是接收端的问题 接收用一个死循环来接收
striking
2006-04-19
打赏
举报
回复
-_-!!!
sdf123321
2006-04-19
打赏
举报
回复
我是比较了呀,这些都没有问题,关键是我比较后,继续投递下一个WSASend的时候,怎么还会返回WSA_IO_PENDING呢?按理说这时候系统发送缓冲中应该都处理完了呀?
striking
2006-04-19
打赏
举报
回复
那个不叫阻塞, 有时候网络原因, 发出1000个字节, 不是一下子就能全部发出去的,
所以会返回WSA_IO_PENDING (未决), 表示目前系统正在发送数据.
当收到通知后, 根据dwSendNumBytes来判断此次发了多少字节, 比较一下, 剩下未发出去的, 再投递一次. 把剩余的发出去.
sdf123321
2006-04-19
打赏
举报
回复
我是这样呀,我是通过GetQue的参数dwSendNumBytes和WsaSend的发送字节数相同,说明全部发送完毕,才投递下一个WsaSend的,而且只是投递一个WsaSend,这时候WSAsend怎么还会阻塞呢?
striking
2006-04-19
打赏
举报
回复
WSAsend是一种重叠操作, 一般调用是立即返回, 当返回0 表示发送成功, 否则如果返回WSA_IO_PENDING 表示这时候系统正在发送数据, 那么你需要通过GetQue来获得此次发送的结果,
到底是发送了几个字节(通过GetQue的参数dwSendNumBytes获知.)
复现基于改进秃鹰算法的微电网群经济优化调度研究(Matlab代码实现)
内容概要:本文围绕“基于改进秃鹰算法的微电网群经济优化调度”展开研究,利用Matlab代码实现优化算法的仿真与复现。研究重点在于通过改进的秃鹰搜索算法(Bald Eagle Search Algorithm, BESA)解决微电网群在运行过程
中
的经济调度问题,提升算法的收敛速度与全局寻优能力,以实现对分布式能源、储能系统及负荷的高效协调管理。文
中
详细阐述了微电网群的系统架构、
数
学建模过程、目标函
数
设计(如运行成本最小化、碳排放降低等),并结合智能优化算法进行求解,验证了改进算法相较于传统方法在调度精度和效率方面的优越性。同时,研究还探讨了算法在多场景下的适应性,为微电网群的智能化、低碳化运行提供了技术支持与实践参考。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、智能优化算法相关工作的工程技术人员。; 使用场景及目标:① 学习并掌握改进秃鹰算法在复杂优化问题
中
的应用方法;② 实现微电网群经济调度模型的构建与求解;③ 对比不同智能算法在电力系统优化
中
的性能表现;④ 为科研论文复现、课题研究或工程项目提供算法支持与代码参考。; 阅读建议:建议读者结合文
中
提供的Matlab代码逐模块分析,重点关注算法改进策略与调度模型的耦合实现方式,同时可尝试在不同参
数
设置或场景条件下进行仿真实验,以加深对算法性能与调度效果的理解。
【系统设计】智能相控阵波束成形:让无线信号精准“追”着目标走【附python代码】.rar
1.版本:matlab2014a/2019b/2024b 2.附赠案例
数
据
可直接运行。 3.代码特点:参
数
化编程、参
数
可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、
数
学等专业的大学生课程设计、期末大作业和毕业设计。
【模拟带有优化的连续死区控制】基于粒子群优化算法的非最小相位系统的最小化欠阻尼研究(Matlab代码实现)
内容概要:本文围绕多旋翼无人机姿态估计算法的开
发
与性能评估展开系统性研究,重点对比了线性与非线性滤波算法在复杂飞行环境下的表现。通过构建基于扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)等先进算法的姿态估计器,融合IMU、磁力计、视觉传感器等多源
数
据
,有效提升了姿态解算的精度与鲁棒性。研究涵盖了静态悬停、高速机动及磁干扰等多种典型飞行场景,利用MATLAB/Simulink平台完成仿真实验,并结合实测飞行
数
据
与VICON高精度运动捕捉系统提供的真值进行定量分析。结果表明,非线性滤波器在动态工况下具有显著优势,尤其在抑制漂移和抵抗外部干扰方面优于传统线性方法。文章还提出了传感器融合、自适应建模、冗余配置等一系列降低偏差影响的技术路径,为高可靠性无人机导航系统的设计提供了理论依据与实践指导。; 适合人群:具备控制理论、信号处理及状态估计基础知识,从事无人机导航、控制算法研
发
或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于开
发
高精度无人机姿态解算模块;②为多传感器融合算法的设计、实现与验证提供参考案例;③服务于复杂环境下无人系统状态估计的教学演示与科研攻关; 阅读建议:建议结合文
中
所述MATLAB/Simulink仿真模型与实测
数
据
集进行复现与调试,重点关注EKF与UKF的
数
学推导、实现细节及关键参
数
调优过程,深入理解非线性系统建模、状态估计与工程实际之间的平衡与折衷。
RadiAntDICOMViewer医学图像浏览器V1.2.8官方版
已经博主授权,源码转载自 https://pan.quark.cn/s/159e15c92f92 RadiAnt是一款设计精良的DICOM查看软件,作为医学影像的DICOM浏览工具,它是由两位充满热忱的波兰工程师精心打造而成,并且本站点的布局也焕然一新。此软件不仅体积微小,而且操作简便、响应迅速,对于高效快速地查看图像资料具有显著优势。它提供了充足的显示区域来浏览连续图像,支持一次性加载多个图像系列,并且能够在不同系列之间自由切换。该软件采用64位架构进行编译,因而能够高效处理大规模的
数
据
集。它持续进行版本迭代,并且配备了一个功能完备的官方网站,堪称名副其实的实用工具! 功能特性
STM32 pin functions
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 该资源适配于STM32 MINI类型的开
发
平台,详细阐述了各个接口端口的具体作用及其特性。
网络编程
18,356
社区成员
64,164
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章