TCP Socket Verbindungsgeschwindigkeit messen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
tomba
User
Beiträge: 21
Registriert: Montag 14. Dezember 2015, 15:53

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
Science makes you fly to the moon, religion makes you fly into buildings.
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?
tomba
User
Beiträge: 21
Registriert: Montag 14. Dezember 2015, 15:53

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

Science makes you fly to the moon, religion makes you fly into buildings.
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

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.
tomba
User
Beiträge: 21
Registriert: Montag 14. Dezember 2015, 15:53

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.
Science makes you fly to the moon, religion makes you fly into buildings.
Antworten