Seite 1 von 1

TCP Socket Verbindungsgeschwindigkeit messen

Verfasst: Dienstag 1. März 2016, 00:09
von tomba
Guten Morgen. Ich will die max. Transfergeschwindigkeit zwischen zwei TCP Sockets messen!

Meine Idee war:

Socket 1:

Code: Alles auswählen

message_content = ""
message_content += "x" * 1024
current_time = time.time()
endtime = time.time() + 1
sent = 0 
while endtime - current_time > 0:
	sock.send(message_content)
	sent += 1
	current_time = time.time()
Socket 2:

Code: Alles auswählen

current_time = time.time()
endtime = time.time() + 1
bc = 0
sock.settimeout(1)
while endtime - current_time > 0:
	try:sock.recv(1024)
	except socket.timeout:
		break
	bc += 1
	while True:
		try:sock.recv(1024)
		except socket.timeout:
			break
Socket 1 zählt durch sent mit, wie viele 1024 Bytes Packets gesendet wurden

Socket 2 zählt durch bc (bytecount) mit, wie viele 1024 Byte Packets empfangen wurden

Re: TCP Socket Verbindungsgeschwindigkeit messen

Verfasst: Dienstag 1. März 2016, 01:23
von BlackJack
@tomba: Die erste Zeile im ersten Programm ist ein bisschen sinnlos.

Wenn Du sichergehen willst das auch wirklich jedes mal 1024 Bytes gesendet werden, dann musst Du `sendall()` verwenden. `send()` muss nicht alles senden. Die Methode hat die Anzahl der tatsächlich gesendeten Bytes als Rückgabewert.

Ähnlich beim empfangen: ``recv(1024)`` gibt mindestens ein Byte und maximal 1024 Bytes zurück. Wenn Du sicher 1024 Bytes lesen willst, dann musst Du so lange lesen bis Du tatsächlich 1024 Bytes beisammen hast. Oder Du zählst keine ”Pakete” sondern Bytes.

Was soll denn Deiner Meinung nach die innere ``while``-Schleife beim Empfänger bewirken?

Re: TCP Socket Verbindungsgeschwindigkeit messen

Verfasst: Dienstag 1. März 2016, 04:15
von tomba
BlackJack hat geschrieben:@tomba: Die erste Zeile im ersten Programm ist ein bisschen sinnlos.

Wenn Du sichergehen willst das auch wirklich jedes mal 1024 Bytes gesendet werden, dann musst Du `sendall()` verwenden. `send()` muss nicht alles senden. Die Methode hat die Anzahl der tatsächlich gesendeten Bytes als Rückgabewert.

Ähnlich beim empfangen: ``recv(1024)`` gibt mindestens ein Byte und maximal 1024 Bytes zurück. Wenn Du sicher 1024 Bytes lesen willst, dann musst Du so lange lesen bis Du tatsächlich 1024 Bytes beisammen hast. Oder Du zählst keine ”Pakete” sondern Bytes.

Was soll denn Deiner Meinung nach die innere ``while``-Schleife beim Empfänger bewirken?
Ah, okay. Vielen Dank. Ich wusste nicht, dass 'send()' nicht alles senden muss.

Entschuldigung. Habe den Code falsch eingerückt! Die Schleife soll außen sein und die übrigen Pakete "abfangen", falls sie nicht empfangen werden.

War so gedacht:

Code: Alles auswählen

current_time = time.time()
endtime = time.time() + 1
bc = 0
sock.settimeout(1)
while endtime - current_time > 0:
   try:sock.recv(1024)
   except socket.timeout:
      break
   bc += 1
while True:
   try:sock.recv(1024)
   except socket.timeout:
   	break


Re: TCP Socket Verbindungsgeschwindigkeit messen

Verfasst: Mittwoch 2. März 2016, 11:15
von miracle173
tomba hat geschrieben: ...
War so gedacht:

Code: Alles auswählen

current_time = time.time()
endtime = time.time() + 1
bc = 0
sock.settimeout(1)
while endtime - current_time > 0:
   try:sock.recv(1024)
   except socket.timeout:
      break
   bc += 1
while True:
   try:sock.recv(1024)
   except socket.timeout:
   	break

Das passt aber nicht. "endtime" und "current_time" ändern sich nicht mehr und das wird eine Endlosschleife. Vermutlich

Code: Alles auswählen

interval = 1  # second
timeout = 1 # second
current_time = time.time()
first_time=current_time
end_time = current_time + interval
bc = 0
sock.settimeout(timeout)
while end_time >current_time:
   try:sock.recv(1024)
   bc += 1
   current_time=time.time()

while True:

   try:sock.recv(1024)
   except socket.timeout:
   	break

print (current_time-first_time)/bc

[/quote]

Wenn in der ersten Schleife ein Timout auftritt sollte das nicht still ignoriert werden und eine ziemlich sinnlose Messung ausgegeben werden sondern entweder einfach nur die Exception ausfgelöst werden oder irgend eine andere sinnvolle Fehlerbehandlung durchgeführt werden.

Re: TCP Socket Verbindungsgeschwindigkeit messen

Verfasst: Mittwoch 2. März 2016, 15:45
von tomba
miracle173 hat geschrieben:
tomba hat geschrieben: ...
War so gedacht:

Code: Alles auswählen

current_time = time.time()
endtime = time.time() + 1
bc = 0
sock.settimeout(1)
while endtime - current_time > 0:
   try:sock.recv(1024)
   except socket.timeout:
      break
   bc += 1
while True:
   try:sock.recv(1024)
   except socket.timeout:
   	break

Das passt aber nicht. "endtime" und "current_time" ändern sich nicht mehr und das wird eine Endlosschleife. Vermutlich

Code: Alles auswählen

interval = 1  # second
timeout = 1 # second
current_time = time.time()
first_time=current_time
end_time = current_time + interval
bc = 0
sock.settimeout(timeout)
while end_time >current_time:
   try:sock.recv(1024)
   bc += 1
   current_time=time.time()

while True:

   try:sock.recv(1024)
   except socket.timeout:
   	break

print (current_time-first_time)/bc

Wenn in der ersten Schleife ein Timout auftritt sollte das nicht still ignoriert werden und eine ziemlich sinnlose Messung ausgegeben werden sondern entweder einfach nur die Exception ausfgelöst werden oder irgend eine andere sinnvolle Fehlerbehandlung durchgeführt werden.
Ja, der Code war nicht getestet. War nur so ein Konzept. Natürlich muss in die Schleife noch: current_time = time.time()


Und ja, das stimmt. Aber es war wie gesagt eher die Frage, ob dieses Konzept laufen würde.