免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7566 | 回复: 19
打印 上一主题 下一主题

关于socket通信连续发问数据时遇到有问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-16 10:37 |只看该作者 |倒序浏览
问题是:在做socket通信时,在程序端一个循环里,连续的使用send命令进行发送数据,在另一个端,我用的是socket调试助手进行接收数据(发送和接收的都是16进制数据)。按我的理解,在每一行一条send发送命令时,则在socket调试助手端就会显示接收到一条记录,但从事实的接收的效果来看,却是循环每次执行send发送的数据,在接收端变成了像是一次发送时的显示效果如下:

我理解的应该是:
10:22:07 收到数据:{7C 00 06 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF }
10:22:07 收到数据:{7C 00 06 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF }
10:22:07 收到数据:{7C 00 06 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF }

实际上是:
10:22:07 收到数据:{7C 00 06 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 7C 00 06 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF7C 00 06 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF}

请问大家有没有遇到同样的问题,这样是我程序本身写的问题,还是调试助手的显示问题。
有没有可以通过什么设置,可以让他在连续快速的过程中达到上面的效果。(尽管每个包都有包头和包尾)

论坛徽章:
0
2 [报告]
发表于 2007-11-16 10:51 |只看该作者
不解,等高手回答

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2007-11-16 10:55 |只看该作者
TCP只保证发送顺序和数据正确

这个时代AIO盛行,
send()和recv()的次数完全不保证对应

论坛徽章:
0
4 [报告]
发表于 2007-11-16 10:59 |只看该作者
刚才在网上也找了下其它的BBS,也有类似的提问,看了其中的回复,也有提出用sleep()函数的,在发贴之前也试过了,没有成功。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2007-11-16 10:59 |只看该作者
从需求上看,你的业务具有数据报风格
如果你需要可靠的数据报
使用SCTP协议最适合你

用TCP的话,即使加上发送延迟,也不能保证发send 2次,recv就是2次
TCP协议本身就有合并小包的机制

论坛徽章:
0
6 [报告]
发表于 2007-11-16 11:00 |只看该作者
请教3楼 AIO是什么?呵呵

论坛徽章:
0
7 [报告]
发表于 2007-11-16 11:01 |只看该作者
很正常的事情啊
TCP每一次接收数据并不一定完全读完你发送的数据啊!
比如你一下子发送了 1000个字节, 另外一端接收的时候, receive的时候,可以第一次接收接收了300,下一次接收,接收了700

TCP就是个数据流的概念...

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2007-11-16 11:05 |只看该作者
原帖由 cuzzg 于 2007-11-16 11:00 发表
请教3楼 AIO是什么?呵呵


异步IO

论坛徽章:
0
9 [报告]
发表于 2007-11-16 11:06 |只看该作者
原帖由 safedead 于 2007-11-16 10:59 发表
从需求上看,你的业务具有数据报风格
如果你需要可靠的数据报
使用SCTP协议最适合你

用TCP的话,即使加上发送延迟,也不能保证发send 2次,recv就是2次
TCP协议本身就有合并小包的机制



的确,业务完成的功能是,从车站计算机中,查询终端机运行参数版本,根据反馈并下发运营参数文件到终端机。有的参数文件可能会很大,我担心,如果下发多个,如果都合在一起这样,会不会,大太了啊。

哎。。我也是无奈啊。。标书写明就是TCP/IP。。SCTP我去找资料看看,学习下。。

论坛徽章:
0
10 [报告]
发表于 2007-11-16 11:09 |只看该作者
TCP每次真实的发送到网络中的数据是根据路径MTU决定的,如果是以太网,则MTU很可能是1500    所以TCP肯定会把小包合并  大包拆分,这样做是为了避免IP分包出现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP