indy UDP的几个测试

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是在内存中分配的空间。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值