基于TCP协议异步套接字多字段buf接收数据的几个问题

kakabulusi 2017-01-06 02:05:36
异步套接字编程过程中遇到的一些问题:
数据通讯采用TCP协议,使用多个wsabuf结构体接收数据:出现以下问题,恳请大神不吝赐教!!
1.由于网络带宽限制,发送数据可能存在一定的时间延迟,导致数据和消息未能同步到达客户端。例如:一次发送100K的数据,客户端收到接受数据的消息,调用数据时候,可能数据未完全到达,应该如何解决?
2.接受数据端:接收到的数据可能会被截断。一次性发送100K的数据后,客户端在处理数据时可能只接受了50K就开始进行处理,导致数据异常无法正常显示。


或者有哪位知道MFC 异步socket程序的深度运行机理解释一下。
...全文
446 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-01-20
  • 打赏
  • 举报
回复
引用 12 楼 kakabulusi 的回复:
[quote=引用 10 楼 zhao4zhong1 的回复:] 引用的帖子里面我说得还不够清楚?
接收数据是个结构体数组,例如:定义 数组 buffer[2]; buffer[0] 表示协议类型,buffer[1]是实际数据。 假设到达了一批数据, buffer[0] = 'DMP'; buffer[1]=dmp数据流【内容为123456789】; 由于网络故障,客户端收到的数据为 buffer[0] = 'DMP'; buffer[1]=dmp数据流【内容为12345】; 6789 这几个数据在下一个包到达。客户端可以识别出来6789已经是异常数据,前面的数据是12345,已经可以判断出异常。 如果是这种情况,客户端是否应该丢弃异常包重新向服务器请求数据? 再如果网络状态比较差,每次buffer[1]的内容都被截断的话,服务器和客户端会陷入一种类似死循环的情况。 [/quote] http://bbs.csdn.net/topics/380167545 104楼: ·仅收到起始符的前半部分字节时怎么办? ◆等收其余字节,超时则断开连接。 ·仅收到长度的前半部分字节时怎么办? ◆等收其余字节,超时则断开连接。 ·收到4字节的长度比如FF FF FF FF(表示后续包体长度为0xFFFFFFFF,或者包头+包体长度0xFFFFFFFF即后续包体长度0xFFFFFFFF),但后续收到数据长度迟迟达不到要求怎么办? ◆断开连接。 ·比如约定每个包最大长度为0x10000000,但收到的包头中长度超过0x10000000怎么办? ◆断开连接。 ·应用需要发送超过长度0xFFFFFFFF个字节的包怎么办? ◆由应用负责拆成≤0xFFFFFFFF个字节的包发送,接收后再合并。
kakabulusi 2017-01-19
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
引用的帖子里面我说得还不够清楚?
接收数据是个结构体数组,例如:定义 数组 buffer[2]; buffer[0] 表示协议类型,buffer[1]是实际数据。 假设到达了一批数据, buffer[0] = 'DMP'; buffer[1]=dmp数据流【内容为123456789】; 由于网络故障,客户端收到的数据为 buffer[0] = 'DMP'; buffer[1]=dmp数据流【内容为12345】; 6789 这几个数据在下一个包到达。客户端可以识别出来6789已经是异常数据,前面的数据是12345,已经可以判断出异常。 如果是这种情况,客户端是否应该丢弃异常包重新向服务器请求数据? 再如果网络状态比较差,每次buffer[1]的内容都被截断的话,服务器和客户端会陷入一种类似死循环的情况。
worldy 2017-01-11
  • 打赏
  • 举报
回复
引用 2 楼 kakabulusi 的回复:
如果客户端检测到数据未发送完毕,是否重新向服务器请求该批次数据?
客户端无需再申请。发送端可以将整个数据块一次发送到winsock,(tcp层会自动分块发送,)但是接收端会分块接收
赵4老师 2017-01-10
  • 打赏
  • 举报
回复
引用的帖子里面我说得还不够清楚?
kakabulusi 2017-01-10
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
大神,给个比较好的指教吧,IIS、ORACLE、SQLSERVER 基于TCP协议的远程访问稳定性就很好,而且受带宽影响不大。它们的实现是怎么一种算法??
赵4老师 2017-01-09
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
向立天 2017-01-07
  • 打赏
  • 举报
回复
制定通信协议,接收端循环接收
hhhh63 2017-01-07
  • 打赏
  • 举报
回复
引用 5 楼 kakabulusi 的回复:
少点的数据早已调通了,就是数据多的时候出现了问题。
可以考虑分包发送,等几个包都收到以后再处理。
kakabulusi 2017-01-06
  • 打赏
  • 举报
回复
引用 4 楼 hhhh63 的回复:
先发个少点的数据试试,几十个字节,等调通了再试大数据。
少点的数据早已调通了,就是数据多的时候出现了问题。
hhhh63 2017-01-06
  • 打赏
  • 举报
回复
先发个少点的数据试试,几十个字节,等调通了再试大数据。
Eleven 2017-01-06
  • 打赏
  • 举报
回复
引用 2 楼 kakabulusi 的回复:
如果客户端检测到数据未发送完毕,是否重新向服务器请求该批次数据?
你采用是TCP,数据完整准确到达接收端是有保证的,你接收端只需调用recv接收即可,判断recv的返回值是否达到指定的字节数大小。
kakabulusi 2017-01-06
  • 打赏
  • 举报
回复
如果客户端检测到数据未发送完毕,是否重新向服务器请求该批次数据?
worldy 2017-01-06
  • 打赏
  • 举报
回复
接收未完整就等待。一般,你必须在第一个包的某个位置申明你的包的大小,然后,以这个数据判断包是否接收完整。

18,363

社区成员

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

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