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