Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Netzwerk Benchmark (https://www.delphipraxis.net/64150-netzwerk-benchmark.html)

Patrick 28. Feb 2006 10:43


Netzwerk Benchmark
 
Hallo,

Ich habe vor ein Netzwerk-Benchmark Programm zu schreiben. Ich benutze dafür den Server- und Client-Socket.
Ich habe mir gedacht, dass ich eine Variable anlege, un diese immer wieder sende.

Jetzt meine erste Frage: Die Variable sollte von der Größe her variabel sein, also wollte ich einen String (sentvar) nehmen:
Delphi-Quellcode:
SetLength(sentvar,1024);
size:=SizeOf(sentvar); //size=4
Bin ich jetzt doof, oder warum ist ein String mit der Länge 1024, der eine Zeichenkette ist, bei dem ein Zeichen 1 Byte hat, nur 4 Byte groß?

Mein zweites Problem: Ich jage die eher die Prozessorauslastung hoch, anstatt der Netzwekrauslastung.
Delphi-Quellcode:

var sentvar : array [1..1024] of char; //damit ist sentvar 1024 Bytes groß! ist der Array dynamisch ist er wieder nur 4 Byte groß!
procedure TForm1.Button3Click(Sender: TObject);
var Socket: TCustomWinSocket;
    i,j : integer;
    size : integer;
begin
//SetLength(sentvar,1024);
size:=SizeOf(sentvar);
if ClientSocket1.active=true then
begin
  for i:=1 to 1048576 do
  begin
    Clientsocket1.Socket.SendBuf(sentvar,size);
  end;
end;
end;

procedure TForm1.Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  bytes:=bytes+Socket.ReceiveLength;
  Socket.ReceiveBuf(sentvar,Socket.ReceiveLength);
  Label5.Caption:=InttoStr(bytes);
end;
Ausserdem habe ich nicht das Gefühl, dass alles an Bytes am Zeil ankommt...

Gruber_Hans_12345 28. Feb 2006 10:49

Re: Netzwerk Benchmark
 
du mußt length für einen String verwenden.

und ich glaube es müsste so sein
Delphi-Quellcode:
    Clientsocket1.Socket.SendBuf(@sentvar[1], length(sentvar));

Basilikum 28. Feb 2006 10:49

Re: Netzwerk Benchmark
 
Zitat:

Zitat von Patrick
Delphi-Quellcode:
SetLength(sentvar,1024);
size:=SizeOf(sentvar); //size=4

ein String ist im Prinzip ein Pointer, und ein Pointer ist auf 32-bit-System nun mal 4 Byte gross... :-)

verwende bei Strings zur Längenbestimmung Length()

Zitat:

Zitat von Patrick
Delphi-Quellcode:
Clientsocket1.Socket.SendBuf(sentvar,SizeOf(size));

das selbe Problem... du versendest nur die Adresse des Strings... und zwar 4 Byte, da ein Integer (sizeof(integer)) 4 Byte lang ist

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var Socket: TCustomWinSocket;
    i,j : integer;
    size : integer;
begin
SetLength(sentvar,1024);
size:=Length(sentvar);
if ClientSocket1.active=true then
begin
  for i:=1 to 1048576 do
  begin
    Clientsocket1.Socket.SendBuf(sentvar[1],size);
  end;
end;
end;

shmia 28. Feb 2006 11:05

Re: Netzwerk Benchmark
 
Zitat:

Zitat von Patrick
Ich habe vor ein Netzwerk-Benchmark Programm zu schreiben. Ich benutze dafür den Server- und Client-Socket.
Ich habe mir gedacht, dass ich eine Variable anlege, un diese immer wieder sende.

Dann verwende doch den Port 7 (=Echo). Du sparst dir damit in den meisten Fällen das Server-Programm.
Normalerweise antwortet jeder Windows-Server und jeder Unix-Rechner auf dem Port 7 (sowohl TCP als auch UDP). Und falls nicht, lässt sich dies nachkonfigurieren.

Der Echo-Port lässt sich dazu benützen, um den Netzwerkdurchsatz zu messen.
Der Durchsatz hängt natürlich auch von der Paketgrösse ab. Kleine Pakete verursachen mehr Overhead.

Ich habe hier übrigens ein fertiges Programm in der Schublade.

Patrick 28. Feb 2006 12:00

Re: Netzwerk Benchmark
 
@Shmia: Ich möchte das aber komplett programmieren. Wo bliebe denn da der Lerneffekt? ;-)

Also irgendwie kriegt mein Programm den Arsch nicht hoch: Dümpelt im Besten fall bei 10% Netzwekauslastung einer 54 MBit/s Netzwerkkarte rum. Und die Packetgröße beträgt gerade mal 1460 Byte...

Wie krige ich das ganze noch besser hin? Ans Maximum?

Komischerweise sind die Packete immer 1460 Byte groß. Dabei müssten sie doch verschieden groß sein, da er den 1048576 Byte großen "sentvar" zerlegt. Komischerweise hatte ich einmal eine Konstante Packetgröße von etwa 960 Byte...

Mein Code:

Delphi-Quellcode:
var sentvar : string;
    bytes, zahler : int64;

procedure TForm1.Button3Click(Sender: TObject);
var Socket: TCustomWinSocket;
    i,j : integer;
    size : integer;
begin
SetLength(sentvar,1048576);
size:=length(sentvar);
if ClientSocket1.active then
begin
  for i:=1 to 100 do
  begin
    Clientsocket1.Socket.SendBuf(sentvar[1],size);
  end;
end;
end;

procedure TForm1.Read(Sender: TObject; Socket: TCustomWinSocket);
var size : integer;
begin
  size:=Socket.ReceiveLength;
  SetLength(sentvar,size);
  Socket.ReceiveBuf(sentvar[1],size);
  zahler:=zahler+1;
  Label7.Caption:=InttoStr(zahler);
  bytes:=bytes+size;
  Label6.Caption:=InttoStr(size);
  Label5.Caption:=InttoStr(bytes);
  if zahler<100000 then
    Socket.SendBuf(sentvar[1],size);
end;

Klaus01 28. Feb 2006 12:16

Re: Netzwerk Benchmark
 
... schon mal mit Ethereal geschaut, wie deine Packete aussehen und
in welchen Abstand sie gesendet werden?

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz