LeftSize := ScrStream.Size;//数据包的大小 //剩余部分大于一个包时
while LeftSize>512 do
begin
ScrStream.ReadBuffer(Buff,512);
NMUDP2.SendBuffer(Buff,512); { 将数据发到主控机}
LeftSize:=LeftSize-512;
end; ScrStream.ReadBuffer(LeftSize,512);
NMUDP2.SendBuffer(LeftSize,512); { 将数据发到主控机}只要数据包大小大于8192字节,机会出现超出部分根本接受不到的问题。
请那位朋友执教一下。如何解决这个问题!
while LeftSize>512 do
begin
ScrStream.ReadBuffer(Buff,512);
NMUDP2.SendBuffer(Buff,512); { 将数据发到主控机}
LeftSize:=LeftSize-512;
end; ScrStream.ReadBuffer(LeftSize,512);
NMUDP2.SendBuffer(LeftSize,512); { 将数据发到主控机}只要数据包大小大于8192字节,机会出现超出部分根本接受不到的问题。
请那位朋友执教一下。如何解决这个问题!
好像是8k,记不清楚了
如果这样,带宽消耗较大,那其不如用TCP
LeftSize := ScrStream.Size;//数据包的大小 //剩余部分大于一个包时
while LeftSize>512 do
begin
ScrStream.ReadBuffer(Buff,512);
NMUDP2.SendBuffer(Buff,512); { 将数据发到主控机}
LeftSize:=LeftSize-512;
//在这里加一句就可以了
Application.ProcessMessages;
end;
1>用2个NMUDP,一个发送,一个接收;没有使用多线程
2>用 IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
并且(1)不改变默认缓冲大小试验
(2)多次改变缓冲区大小试验
结果还是不行
3>利用第三方的UDP控件包BufferUDP,结果还是一样只要一次传送数据大于8192字节(进行了分包发送,包的大小为512),就会出现超出部分根本接受不到.我的开发环境为win2000, delphi6.0
系统管理员权限。
你能把你的处理部分贴出来吗? 谢谢
//--------------------------------unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, NMUDP;type
TForm1 = class(TForm)
UDP1: TNMUDP;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure UDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure FormShow(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
Count: Integer;
AllStr: String;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
PStr1: Array [0..512] of char;
i, j: Integer;
begin
FillChar(PStr1, 513, 0);
for i:= 0 to 511 do PStr1[i]:= '1';
for i:= 0 to 20 do
begin
UDP1.SendBuffer(PStr1, 512);
Application.ProcessMessages;
end;
end;procedure TForm1.UDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
Var
pp: Array [0..512] of char;
i: Integer;
begin
Count:= Count + 1;
UDP1.ReadBuffer(pp, i);
AllStr:= AllStr + StrPas(pp);end;procedure TForm1.FormShow(Sender: TObject);
begin
Count:= 0;
AllStr:= '';
end;procedure TForm1.Button2Click(Sender: TObject);
begin
showmessage(IntToStr(Length(AllStr))+ '<>' + IntToStr(Count));
end;end.
可以通过延时的方法,即在每次发送完后Sleep一段时间。或在OnDataSend事件中调用发送
如果利用Sleep的话,就没法充分利用UDP速度快优势呀!