网络高手看过来!(200分)

  • 主题发起人 主题发起人 Delphi On Me
  • 开始时间 开始时间
D

Delphi On Me

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用UDP协议广播数据。
书上说;用UDP广播数据,数据报的数据部分不应超过512字节,
所以我就把数据分割成420字节大小的包发送出去,
但是总是不能完整地接收到,一般只能正确地接收40个左右的包
无奈之下,用NetXRay跟踪了一下,
发现前面几十个UDP数据包都是420字节,
紧接着一个UDP包大小为832字节
再往下的UDP包大小为1522字节。
这说明:数据包并不是按我所想的那样每次只发送420个字节。

想请教各位:该怎么把数据分割成块广播出去?
我现在用的方法是:
SendSkt.Close;
SendSkt.Proto := 'udp';
SendSkt.Addr := '255.255.255.255';
SendSkt.Port := '3100';
SendSkt.LocalPort := '0';
SendSkt.Connect;
pn :=1;
while(m.position<m.size)do
begin
if (m.Size - m.Position>DataSize) then
begin
pkt.PktNo := pn;
Inc(pn);
pkt.size := DataSize;
pkt.Flag := 1;
m.Read(pkt.Data,DataSize);
end
else
begin
pkt.PktNo := pn;
Inc(pn);
pkt.size := m.Size - m.Position;
pkt.Flag := 0;
m.Read(pkt.Data,m.Size - m.Position);
end;
SendSkt.Send(@pkt,sizeof(TPacket));
end;

SendSkt是ICS的TWSocket;

BTW:请不要告诉我这是因为UDP不可靠的原因。
不知大家有没有用过e/pop?它也是用UDP广播的,
传送几兆大小的数据简直是万无一失。
 
每发一次处理一下消息,等待一段时间看看
 
To Pipi:
我试过的,没有用。
想请教一下Pipi:用WinSock的Send好象是把数据发到缓冲区,
并不是立即发出,这是不是造成上述现象的原因?
我一直怀疑是ICS控件的原因,功能太多往往造成效率的降低。
不知你有没有用纯winsock API试过,那样会不会强些?(我水平
不够,还不会用纯winsock API)
谢谢!
 
用winsock api并不复杂,初始化选udp协议,类型用SOCK_DGRAM,发送用sendto,接收用recvfrom,
参数不能用SOCK_STREAM,不能connect,也不能listen
 
To Delphi On Me:
我想请问一下,你的netxray是从哪里下的,我手上的是DEMO版,只能拦截前五包
先谢过了
 
http://www.net-wing.net/kangwei上有个例子,不知效果如何。
 
好象是在home.jxdcb.net.cn下载的
 
Chenlili:
是哪个例子啊?
 
这和系统实现有关,前面有个类似的tcp问题,为了提高协议效率,会把数据缓冲到一个
合理的大小才送出.
 
我给你一个序列号:
s/n: 1D-00000011-PPAZBk //3.0.3版本的

你把sn输进去就是完全版的了
 
多人接受答案了。
 
后退
顶部