免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: cuzzg
打印 上一主题 下一主题

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2007-11-16 11:12 |只看该作者
原帖由 cuzzg 于 2007-11-16 11:06 发表



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

哎 ...



你这个业务有点象6大干线的GPRS系统数据报
这样,你的recv的缓冲区设定成send的整数倍
根据recv的返回值判断接收是否完整,是否多个

论坛徽章:
0
12 [报告]
发表于 2007-11-16 11:19 |只看该作者
原帖由 safedead 于 2007-11-16 11:12 发表



你这个业务有点象6大干线的GPRS系统数据报
这样,你的recv的缓冲区设定成send的整数倍
根据recv的返回值判断接收是否完整,是否多个

哈哈,车站计算机?????  铁路上用的啊?! !!!
铁路上用的一般都是定个协议吧, 比如包头,数据长度, 数据类型, 内容, CRC, 包尾 (此处的数据包,不是TCP协议的包的概念,就是自己定义的数据包)
一端发送的时候把数据内容塞到按照包的格式发送
另外一端接收的时候, 接收完整一包才处理.......
都是这样操作的吧.......
这样一端收到数据,判断是否合法,合法的话,拆包,处理...

论坛徽章:
0
13 [报告]
发表于 2007-11-16 11:23 |只看该作者
原帖由 cuzzg 于 2007-11-16 11:06 发表



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

哎 ...

不能自己制定运行与TCP上的协议吗?标识出开始结尾
如果是对于一次发包太大的担心  我觉得完全没有担心的必要  TCP会完成分包和合并的工作。

论坛徽章:
0
14 [报告]
发表于 2007-11-16 11:49 |只看该作者
原帖由 alazer 于 2007-11-16 11:19 发表

哈哈,车站计算机?????  铁路上用的啊?! !!!
铁路上用的一般都是定个协议吧, 比如包头,数据长度, 数据类型, 内容, CRC, 包尾 (此处的数据包,不是TCP协议的包的概念,就是自己定义的数据包)
一端发送的时候把数 ...


呵呵。恩,是。地铁。。地铁标准协议规范有你说的那个些。呵呵。。自己定义的数据包格式。。

我自己也深想了下,一般的操作是同步的方式(一问一答),不过好像下发参数文件,应该是异步的方式(这边一顿发,那边按自定义的标准的包长度收)。

确定不了,回头再细看看标书,问问单位老鸟。呵呵

论坛徽章:
0
15 [报告]
发表于 2007-11-16 11:54 |只看该作者
alazer    有经验啊

论坛徽章:
0
16 [报告]
发表于 2007-11-16 15:01 |只看该作者
除非你发一次接收方确认一次,才继续发,否则,不可能保证你发一次就收一次,就算是这样,如果网络原因,也可能需要你发一次,接收多次才能完成.只有自己在每次发送前附带长度.然后接收完一次处理一次

论坛徽章:
0
17 [报告]
发表于 2007-11-16 22:20 |只看该作者
禁用nagle算法或者

论坛徽章:
0
18 [报告]
发表于 2007-11-16 22:26 |只看该作者
uint32 arg = 1;
setsockopt(fd, 0x6, TCP_NODELAY, (const char*)&arg, sizeof(arg))
把nagle算法关掉,这样每次只要发送不管数据包大小都会立即发送,
可以这样试下,呵呵 第一次发贴

论坛徽章:
0
19 [报告]
发表于 2007-11-16 22:28 |只看该作者
刚把字打完有人就我前面了

论坛徽章:
0
20 [报告]
发表于 2007-11-17 09:59 |只看该作者
楼主的问题是处理tcp长连接时所必须面对的问题

方法一般有两种(可能还有其他的),在send的包里面指定一个长度,比如前四个字节专门用来说明你一个完整的协议包有多长,接收端在接收的时候,先rev四个字节,解析这四个字节,确定还要rev多长,然后就可以知道再次rev多长的数据了,循环如此就可以解决这个问题。。

第二个,指定固定的标识符,比如以某个字符作为数据的截止,如:\n,接收端接收1k的数据,检查一下是否有\n,没有的话接着rev,有的话,把到\n为止的当做一个数据,剩下的当做下一个包的开头,再次rev,循环如此,就可以解决这个问题了。。

短连接的话,给足够长的缓冲区就可以了。。

[ 本帖最后由 scut_eros 于 2007-11-17 10:04 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP