现在的位置: 首页 > 综合 > 正文

indy UDP的几个测试

2012年08月31日 ⁄ 综合 ⁄ 共 1536字 ⁄ 字号 评论关闭

1、当Server来不及处理时,能缓存多大数据?

[Server]
procedure TFormServer.UDPServer_MainUDPRead(Sender: TObject;
  AData: TStream; ABinding: TIdSocketHandle);
begin
  ShowMessage('Hold');
end;

[Client]
procedure TForm2.Button1Click(Sender: TObject);

var
  MS:TMemoryStream;
begin
  MS:=TMemoryStream.Create;
  try
    IdUDPClient1.Active:=true;
    MS.Size:=1024;
    IdUDPClient1.SendBuffer(MS.Memory^,MS.Size);
    IdUDPClient1.Active:=false;
  finally
    MS.Free;
  end;
end;

Client第1次发送后,服务器弹出独占Form冻住,然后Client在发送10次,每次1K,在服务器端,一共可以看到9次弹出窗体,除去第一次,也就是说服务器能缓存8次,即8K资料。

要改变缓冲区大小,可以这样,如下面代码,把缓冲区大小改为80K:

procedure TForm1.FormCreate(Sender: TObject);
var
  vBuffer:integer;
begin
  IdUDPServer1.Active:=true;
  vBuffer:=1024*80;
  IdUDPServer1.Binding.SetSockOpt(Id_SOL_SOCKET, Id_SO_RCVBUF, PChar(@vBuffer), SizeOf(integer));
end;

在接收缓冲区满后,ethereal仍然能抓到持续送来的包。

2、Client一次能发的最大包是多少? (非MTU)

TidUDPServer的BufferSize指一次能接收的最大封包。预设为8K,客户端一次发送的数据不能比这个大,否则服务器收不到,如果服务器的BufferSize设为80K,经过步步逼近测试,客户端一次最大只能发送1024*64-29,即65507,比64K少一点,再大一个byte,都会在客户端报错“Package size too big”。

UDPServer.BufferSize的大小与Server的8K缓存能力无关,当UDPServer.BufferSize设为80K时,其缓存能力还是只有8K。当UDPServer.BufferSize设为1K时,其缓存能力还是有8K。

但是奇怪的是,当Client的单次发送数据大于8K的时候,服务器还是能缓存一次。

 

===================================

缓存的调整方法:

系统资源(IRQ)分配给网卡一定的内存,通过修改增大网卡使用内存值,让网卡上下载工作时不停顿,从而达到提高网速的目的。

      一、开始=>运行=>MSINFO32.EXE=>确定,打开系统信息=>硬件资源=>IRQ=>找到分配网卡的IRQ值(最近本人机子网卡的IRQ是17)

      查看硬件资源=>内存,可以看到:
      0xE1000000-0xE1000FFF Realtek RTL8168/8111 PCI-E Gigabit Ethernet NIC OK

      恰好是$1000,即8K

      二、开始=>运行=>SYSTEM.INI在[386enh]项下增加一行“IRQ 17=4096”=>保存后重启。(注:将第一步找到的IRQ值写入.本机是17,4096是在内存中分配的空间。

抱歉!评论已关闭.