请教UDP通讯中数据包不定长的问题(ICS) (100分)

  • 主题发起人 主题发起人 hq_pan
  • 开始时间 开始时间
H

hq_pan

Unregistered / Unconfirmed
GUEST, unregistred user!
使用ICS套件,UDP方式通讯,因为它是异步方式的,因此请问一下每次接受的数据包
不定长,该如何编写程序?
数据包包含一个头部记录,3个整型,根据其中一个整型的数值来读取后面的数据。
如,一个包,头部12字节,其中一个数字是300,表示紧跟后面的是300个字节的数据,
当然,整个UDP数据包最大为1k。请问该如何编写程序?
当只有两个IP互发的时候,因为我是一次就读取2k数据,因此接受数据没问题,但是当
同时有3台机子通讯时就不行了,数据错乱。请问如何解决?难道要用阻塞模式的UDP??
嗯,分不是问题,尽管提。
 
定义一个结构,每次都发固定长度的数据包。
 
首先请看这个文章
http://www.delphibbs.com/delphibbs/dispq.asp?lid=726166
得到使用UDP包一次最多发送多少字节。
假定在局域网中,那UDP包一次最多发送1472个字节,也就是说,只要你一次发送的数据小于1472字节,那么你就不需要考虑数据包分片的问题。比如在QQ等采用UDP协议的即时通讯软件中,都对发送消息的文本大小进行了限制,就是这个原因。避免分片而导致的复杂性。
但如果数据包一定要大于1472个字节(比如你用UDP来传输文件),那么你必须对包进行分片,排序。总的原则就是对你的大包给一个ID,分片后的数据包上都有ID和序号。收到数据包后,根据ID和序号合并成所要的数据,也就是说在应用层上实现部分TCP协议的功能。具体我也没有做过,只是些想法,不过你看看TCP协议的细节会对你有帮助。
注:上面说的1472是局域网的数字,在Internet上要更复杂一些。
祝你好运!
 
你们没明白我的意思。
我发送10个UDP数据包,每个包大小都不一样!当然,最大就是1024。
每个数据包头部有自定义结构-3个整型,12字节,根据最后一个字节的
值读出随后这个数据包剩余的数据,如果最后一个数字是300,那么这个
数据包剩下的数据就是300字节,如果是800就读取800个字节。这个长度
是不确定的!
ICS中,TWSocket控件,使用UDP方式,数据来临时没有到达数据的大小,
Function Receive(Buffer : Pointer; BufferSize: integer): integer;
它是通过程序自己调用上面那个Receive决定读取多少字节的,我现在是
分配足够的内存2k,然后一次读取2k的数据,只有两台机子时没有问题,
多了就出毛病了。如果首先读取12字节,然后根据取得的数值再调用Receive
来读取,有错误,好像数据已经没了 :(
我想阻塞模式应该是允许不断读取而不管是否超过了一次接受的包的大小吧。
 
Would somebody answer me????
 
//sigh......
 
用 Socket 通讯可不可能出现这样的情况
一个包分了几次来接收。
比如我发一个 1K 的数据给另一台机
那台机收到 一次为 512 byte 第二次为 512 byte
 
忙完其它事了。。。。累啊~~~
下午有空就进行试验
 
//sigh....
so busy.... :-(
 
很抱歉忘了这篇文章了。
已成过去,也早已放弃,现在结束。
 
后退
顶部