Chinaunix

标题: tcp发送于接收数据问题? [打印本页]

作者: kesine    时间: 2003-04-20 20:53
标题: tcp发送于接收数据问题?
我往一个socket里,用了write两次。
怎么用一次read就把这两次的数据都接收到了?

我想分两次接收怎么办?

请大家多多指教!
作者: uiibono    时间: 2003-04-20 23:35
标题: tcp发送于接收数据问题?
原帖由 "kesine" 发表:
我往一个socket里,用了write两次。
怎么用一次read就把这两次的数据都接收到了?

我想分两次接收怎么办?

请大家多多指教!


可以定义自己的报文格式,举个例子,每次write的报文格式为:
     4位报文长度+报文正文,其中4位报文长度=length(报文正文)+4,
假设一个报文为  "00140123456789", 报文正文为"0123456789",
接收方接收一个报文要read()两次,第一次read() 读4个字节,
可以得到报文正文的长度为 14 - 4 =  10,
然后第二次read() 只要读 10 个字节就可以得到报文的正文 "0123456789"。
不知道这样合不合你用。
作者: kesine    时间: 2003-04-21 07:27
标题: tcp发送于接收数据问题?
这样不行,因为我不知道第一次应该收多少字节。就是说每次发过来的数据长度是不确定的。
作者: flw    时间: 2003-04-21 10:19
标题: tcp发送于接收数据问题?
你到底要发什么?肯定有办法可以确定的!尽管可能不是定长!
作者: uiibono    时间: 2003-04-21 10:35
标题: tcp发送于接收数据问题?
[quote]原帖由 "kesine"]这样不行,因为我不知道第一次应该收多少字节。就是说每次发过来的数据长度是不确定的。[/quote 发表:



说说双方的接口是怎么定义的,或者报文格式是怎么样的。
作者: kesine    时间: 2003-04-21 10:37
标题: tcp发送于接收数据问题?
将要收到的数据的长度是不知道。但是对每一次收到的数据(一帧)的格式是知道的。
write两次,我就认为发了两帧。所以我也要收两帧,才能确定每一帧的格式,即里面的具体内容。如果两帧当作一帧收了,我就不知道帧的格式了,或者说我就会认为丢了一帧。
作者: flw    时间: 2003-04-21 10:39
标题: tcp发送于接收数据问题?
我靠!有什么好保密的?说出来大家听听不就明白了?一会儿我还有一个会议,如果说迟了恐怕就帮不上你了。
作者: kesine    时间: 2003-04-21 10:47
标题: tcp发送于接收数据问题?
协议没有什么好保密的,只不过稍微复杂了点。而且对解决这个问题没有什么帮助。
协议总体结构为:帧类型+帧内容长度+帧内容。
作者: flw    时间: 2003-04-21 10:52
标题: tcp发送于接收数据问题?
这不就结了?
先接收帧类型和帧内容长度,然后根据帧内容长度接收帧内容,如果有剩下的则认为是第二帧。你分多少次收都行。
记住:
在有些时候,收包和解包可能不是同一个过程。
作者: kesine    时间: 2003-04-21 11:07
标题: tcp发送于接收数据问题?
这样做似乎可行,不过麻烦点。
我想要是能够实现发送的此数和接受的次数对应就好了,而不要管每次收多少数据。只要保证每次收的时候能把发送的数据都收到就行。
有可能实现吗?
作者: flw    时间: 2003-04-21 11:11
标题: tcp发送于接收数据问题?
下面有一句话你要记住:
TCP 只保证数据的可靠的(无差错的)、顺序的传送,而不保证一次发送的包肯定是一次接收到。
既然 TCP 不支持,要想支持肯定得自己编程实现了。
作者: 蓝色键盘    时间: 2003-04-21 11:11
标题: tcp发送于接收数据问题?
我看你所描述的接口很想一些地方的电信接口,这个与协议没有什么关系,纯粹属于你应用之间的事情。一句话,要么固定长度的接受,要么在给定长度的情况下接受,否则,无法实现。
呵呵,楼主是中国银行的人吧!?
作者: kesine    时间: 2003-04-21 14:15
标题: tcp发送于接收数据问题?
这个协议确实是用在电信方面的。厉害这都看出来了!
我自己再去试一试吧。
如果有什么更好的方法还请大家,不吝赐教。
作者: hudong    时间: 2003-04-21 23:06
标题: tcp发送于接收数据问题?
可以变长收发吧,小弟愚笨,但前几天作的网通的接口就是这样的
作者: kesine    时间: 2003-04-22 01:11
标题: tcp发送于接收数据问题?
我也有这个考虑,就是发送的时候发垃圾“00”把字节填到可能发送的最大值。
难道TCP不能做到,发了多少次就要求收多少次吗?
作者: fieryfox    时间: 2003-04-22 09:33
标题: tcp发送于接收数据问题?
TCP传送的是流,没有边界的字节流,所以除了可靠性之外的任何事情都在你的职责范围之内。
作者: wangz    时间: 2003-04-22 09:49
标题: tcp发送于接收数据问题?
原帖由 "kesine" 发表:
我也有这个考虑,就是发送的时候发垃圾“00”把字节填到可能发送的最大值。
难道TCP不能做到,发了多少次就要求收多少次吗?


无论怎么收,都要知道对方要发送多少字节或知道以什么为结束,不然要协议干吗?TCP只提供了通信方法,要实现目标,还需要通过协议来协助。
作者: 蓝色键盘    时间: 2003-04-22 11:01
标题: tcp发送于接收数据问题?
TCP是面向连接的有序的无边界字符流,读写多少完全是由应用来控制的。
作者: kinghood    时间: 2003-04-22 11:55
标题: tcp发送于接收数据问题?
哈哈哈
这么容易的问题搞这么久
先收包头(包头的长度是固定的)
从包头里解出包体长度,再根据长度收包!
作者: 无双    时间: 2003-04-22 12:51
标题: tcp发送于接收数据问题?
如果不想发包头的话
那么试每发一个包都要回应

然后再发下一个包

这样可以满足你的要求
只是性能方面会比较低
作者: kinghood    时间: 2003-04-22 13:11
标题: tcp发送于接收数据问题?
不发包头很难识别是否为有效包
作者: chenbobo    时间: 2003-04-22 14:21
标题: tcp发送于接收数据问题?
很简单啊,在每个数据包的后面加上一个"|"字符。我在很多场合(银行与电信)写通讯程序时都是这样
作者: chenbobo    时间: 2003-04-22 14:27
标题: tcp发送于接收数据问题?
在Write每个数据报之前,在该数据包后面加上“|”,

在Read时,对每次接收的数据报进行处理(我有处理程序)。很简单的,在很多比较大的场合都在用。
作者: kinghood    时间: 2003-04-22 14:55
标题: tcp发送于接收数据问题?
1,visa包常用"|"作字段分隔符
2,无法保证用户输入的字符没有"|"
作者: margin_xp    时间: 2003-04-22 15:25
标题: tcp发送于接收数据问题?
大家好!有谁可以上载个例子给我参考参考吗?
作者: kesine    时间: 2003-04-22 21:32
标题: tcp发送于接收数据问题?
我现每次都write固定字节数(约定最大数据包长度)
read也是固定字节长度,这样能保证write的次数和read的次数相同。
这样做的缺点是,当数据包没有达到最大长度时不得不发一些无效的数据以填满数据包。
因为以前的程序结构就是这么设计的,所有也没有其它办法了。
作者: 无双    时间: 2003-04-23 08:09
标题: tcp发送于接收数据问题?
如果在包的某一位置有一个变量指定包类型
同时这种类型的包长度已知并固定

那么也可以先接收这个字节
再根据这个字节接收指定长度的包
作者: yourkeychen    时间: 2003-04-23 13:35
标题: tcp发送于接收数据问题?
我对此不精通,但我想,在每次发送信息的后面加上结束标志不行吗?读的时候可以根据此标志是否继续读下一个内容啊
作者: 无双    时间: 2003-04-23 17:41
标题: tcp发送于接收数据问题?
那你必须读入一个缓冲区
然后在缓冲区中查找这个结束标记

性能也不是很好吧

但也是一种方法
作者: kinghood    时间: 2003-04-24 09:25
标题: tcp发送于接收数据问题?
唉,被你们气死了,你加个结束符能保证包在传播途中没被篆改过吗?
被别人载走一部分你能知道?从安全角度来说发包一定要带上包长度和mac校验码!当然,如果你只是写个demo程序那就无所谓了
作者: 蓝色键盘    时间: 2003-04-24 10:09
标题: tcp发送于接收数据问题?
还在讨论,呵呵!
1、传输是有TCP本身的特性决定的。
2、在传输的过程中,是相对安全的,如果为了数据保密可以做一些加密或者检验或者设备号校验等。这些属于应用的设计问题。
3、数据的收发纯粹是自由的,完全有程序来控制。一次接受发送多少的数据量只收到系统最大TCP传输数据的限制,但是这种限制可以通过发送多次来解决。
作者: fieryfox    时间: 2003-04-25 13:20
标题: tcp发送于接收数据问题?
讨论的这些时间,读一读UNIX Network Programming吧。
作者: dwd_china    时间: 2003-11-05 18:35
标题: tcp发送于接收数据问题?
可以使用指针的方式读取您的接收缓冲区,但是在每次不要清除,使用完成在清除
作者: marco_hxj    时间: 2009-11-04 15:09
TCP通讯,确定帧长度以后,一直read,直到读到的数等于长度,一定能读到这么多吗?不会丢数据吗?要是读不到这么多,就死循环了
感觉这里用select做超时很难实现啊
作者: c/unix    时间: 2009-11-04 15:17
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2