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