你碰到过吗这样的问题?(100分)

  • 主题发起人 主题发起人 maming
  • 开始时间 开始时间
M

maming

Unregistered / Unconfirmed
GUEST, unregistred user!
做以下试验:
udp通讯程序做好后.在internet上用,设定双方的ip和端口,一句话,双方能通讯了。
如果不断的一条一条的发送消息,对方收到的消息有时会出现多条合并的现象。
在局域网里试不出来,估计是路由的问题。
想过几种解决方法,如象qq一样的限定消息长度。
不知那位高人还有好的解决办法。
 
发送方发送完信息后等对方回信,
接收方每收完一条信息就回发一个约定信息。
如果在一定时间内收不到回信就重发或提示断线。
 
>>>如果在一定时间内收不到回信就重发
正是在重发的时候出现了重叠了。分析情况如下:第一条信息发出一定时间后没有收到回信,
重发,第二条消息到达的时候第一条消息也到达了,于是出现了重叠。
 
加标识符,如
#begin#消息内容#end#
接收的时候区分开来
 
要是消息合并后,第二条就相当于收不到了或是只收一半(udp有2048的限制);
 
你这个重叠的意思是接受到的数据包内容重叠,还是消息显示时重叠。后一种情况可能
显示问题,前一种情况:
是不是你重发机制里的等待时间不合适或重发机制不合理,
比如你在本地重发的第一条消息时
正好和第二条消息发送重叠,结果在本地消息就重合了,远端自然也有问题。
 
我是这样做的,消息发送出去后就等待回信,在指定的时间时间里没有收到回信就重发。
而在接收端发现nmudp收到了两条消息是重叠的。至于如何查看数据包重叠我就不知道了。
本地重发的时候消息应该不会重叠。
 
我想可能是接受端缓存覆盖问题,可以这样解决,在消息末尾加一个标志,表示该消息结束
然后判断缓存是否接受完消息,接受完就把消息传送给程序,并清空缓存。
 
>>我是这样做的,消息发送出去后就等待回信,在指定的时间时间里没有收到回信就重发。
>>而在接收端发现nmudp收到了两条消息是重叠的。至于如何查看数据包重叠我就不知道了。
>>本地重发的时候消息应该不会重叠。

如果因为网络过慢造成消息重复的话。
可以给消息加编号.
相同编号和低于当前应收编号的消息放弃。
 
不是重复,是重叠.如下:
发送端:第一条"11111111111111111"
隔了1分钟还没有收到回信
发送第二条"2222222222222222222"

有时就会出现这种情况,
接收端:收到的信息为"111111111111111112222222222222222222"
 
我没做过这方面的工作,但我猜测是不是应该在每个数据前后有识别的内容,表示这段数据
结束了,另外再收到的是别的数据,否则路由器这样的编程不是一塌糊涂了。
所以应该能有办法区分非同一条消息的。
仅供参考!
 
感觉TCP才会出现这种情况,UDP也会?

有两种解决办法,一是在你的每一条消息末尾添加结束标志,比如#3.
第二种办法是在你的消息头部添加消息长度,比如每条消息的前4个字符用来存放消息字节数XXXX.
然后用这个字节数来取出消息内容.
 
区分消息有很多种办法,问题是两个消息叠加之后就变成了消息不完整或是丢失的现象了。
请看以下例子:udp一次只能接收2048个字节。这样的话,如果我第一条发送了2000,第
二条也发送2000字节,重叠之后。变成了第一条消息中出现了两个消息头,而只有一个消息
结束了。
谁能说明一下udp的消息重叠的正确理解和解决办法呢?我现在的理解是internet的路
由引起的前一条消息与后一条消息的叠加,为什么udp不能区分呢?(同一个客户端发送两次)
socket没有限制消息长度,是不是也存在这个问题呢?
我试了一下,qq一次只能发送600多个字节。是不是也是因为这个问题呢?
 
  第一,你的消息内容如果是QQ一样的对话消息(只要不是110、119之类的),那么我建
议你限制消息长度,最好是在500字节左右,这样更保险。因为有的路由器设置MTU为576。

  第二,看你用的什么控件,我先后使用过NMUDP和ICS的WSocket,它们都有严重问题。
NMUDP会出现覆盖的情况,发送端发送11111和22222两条,接收端可能接收到两条都是22222,
ICS不这样覆盖,但是它会在两条都收到以后,再来一条,IP、端口、消息都是随机的。
 
同意光子.

以太网中的MTU为1500.这是Windows的默认设置.
但是很多路由器的MTU设置为576.
所以出于效率考虑,最好是将UDP数据报的大小限制在576bytes以内.
除去28bytes的首部字节,数据区应该控件在548bytes以内.
不知道需不需要考虑数据报中转义字符的情况?

2 maming:如果你自己使用了区分消息机制,那么你完全可以实现一个自己的数据缓冲区.
每次取一条正确的消息,应该不存在你说的问题。
 
2 maming:不知道你是怎么试的,QQ应该是限制一条消息在500bytes以内吧.
 
2 wheel:对,你是正确的。
2 光子:限制在500bytes以内只能解决速度,消息还是会重叠。

难道真的没有办法让消息不重叠?
 
看来只能这样子了,还是结束算了,总要提前,好麻烦的。
 
try this(c code)

int bNoDelay = 1;
setsockopt(m_fd, IPPROTO_TCP, TCP_NODELAY, (const char *)&bNoDelay, sizeof(u_int));
 
后退
顶部