****************如何修改TIdUDPServer每次传输的数量!!*****************(50分)

  • 主题发起人 主题发起人 Neo_leaf
  • 开始时间 开始时间
N

Neo_leaf

Unregistered / Unconfirmed
GUEST, unregistred user!
在TIdUDPServer里,
OnUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);事件,
AData每次只能接收到700个字节数,
有没有办法调大??
另外,我已经把其BufferSize改为8192,还是不行,
 
每次接收的长度不一致的,你没办法控制的。。。
最多一次接收8192,即8k,你可以多次接收。。。
自己控制总的接收长度
 
但是我才接收了700字节啊,
他就截断了,本来的长度是854的,结果分了两次传过来的,
第一次:700;第二次:154。
有没有什么办法可以设置可以让他一次接收,
----------------
另外,我已经把其BufferSize改为8192,还是不行,
 
UDP居然分2次才接收完一个包?
 
不会吧?更大的包都应该可以的。你是自己定义的数据包吧,
 
没有自己定义数据包,
的确是分两次的,
我是跟踪看的,
 
UDP自己分包,还真的怪了,是不是你的程序(或组件里面)本身发了两次,UDP数据包要么
一部分或整包丢弃,要么就接收一部分/完整,那里还能接收两次。无链接的协议。
 
具体情况是这样的,
俺先发条命令到一台设备上,向其讨要数据,
在接收到讨要到的数据后,将其分析,插入我的数据库,
但是现在突然发现问题了,就是数据不完整,
最后跟踪一看,原来是接收的数据分了两次返回,后面的被截断了,
后面的接收不了,这样导致后来的154条数据没有办法插入。
 
另外,想请问大家,
如果用API函数有没有办法解决这个问题呢,
该如何用呢,
 
TIdUDPClient一次把包都发过来了吗?
 
来自:jacket84, 时间:2006-8-31 11:34:21, ID:3550546
TIdUDPClient一次把包都发过来了吗?
------------------------
对方是设备啊,
直接用TIdUDPServer接收的。
 
建议用socket,indy跟其他的接口不好,以前我们用Indy的控件跟C#的套节字通讯,就出现类似的问题,收到数据流当没有显示对
 
如果你确信每次都是分两次回来,那就是你通讯的设备就是这样做的。解决不难,就是你定义一个公共变量,把两次的数据合在一起存入数据库就可以了。
 
socket如何用?
可以给个简单的例子吗,
建立连接;
发送数据;
接收数据;
关闭连接。。。
 
UDP 一般是,要么收到一个完整的包.要么就收不到.

我觉得你的用法有点问题.
 
To: QSmile,
UDP 一般是,要么收到一个完整的包.要么就收不到.
我觉得你的用法有点问题.
----------------
哦?
我是按照delphi自带的demo链接做的,
做法:
send cmd to device: TIdUDPServer.SendBuffer(DesIP,DesPort,buf,bufsize)
receive data from device: OnUDPRead(Sender: TObject;
AData: TStream; ABinding: TIdSocketHandle);
begin
Analyse AData.....
end;
按你所说,应该如何用呢,
希望不吝赐教。
多谢大家的参与。
 
udp在数据包比较大的时候,确实会拆分了传送,一般用udp传送的话,数据包都在几十个字
节,如果数据包过大的话,就必须自己做数据包的重组,排序,重发。并且加上传送控制协
议。
 
多谢DickWu,
你的回答很中肯,
但是,俺实在是不懂该如何做象你所说的排序、重发等效果,
我是用TIdUDPServer的,
在TIdUDPServer.OnRead事件里接收的,
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部