1. 程式人生 > >indy UDP的幾個測試

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是在記憶體中分配的空間。