ich die Unterschiede zwischen den beiden berüchtigten Fehler in tcp gelernt haben:wie "Verbindung von Peer zurückgesetzt" reproduzieren
[Errno 54] Connection reset by peer
[Errno 32] Broken pipe
Beide Fehler einer Seite des tcp sind Verbindung aus unbekannten Gründen geschlossen, und die andere Seite kommuniziert immer noch damit.
- wenn die andere Seite
write
etwas wirdBroken pipe
- geworfen, wenn die andere Seite
read
etwas,Connection reset by peer
geworfen wird
Ich konnte Broken pipe
mit Python-Codes unten reproduzieren.
# tcp_server.py
def handler(client_sock, addr):
try:
print('new client from %s:%s' % addr)
finally:
client_sock.close() # close current connection directly
if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 5500))
sock.listen(5)
while 1:
client_sock, addr = sock.accept()
handler(client_sock, addr)
Wie für Client
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sock.connect(('', 5500))
>>> sock.send('a')
1
>>> sock.send('a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
socket.error: [Errno 32] Broken pipe
Wenn der Client zuerst send
, ein RST
Paket vom Server zum Client von diesem Moment an wird send
immer Broken pipe
werfen gesendet wird.
Alles oben ist in meinem Verständnis. Allerdings, wenn der Client vom Server zu lesen, Sie ihn immer wieder leere Zeichenfolge statt throw Connection reset by peer
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sock.connect(('', 5500))
>>> sock.recv(1024)
''
>>> sock.recv(1024)
''
>>> sock.recv(1024)
''
>>> sock.recv(1024)
Ich bin hier verwirrt, oder im Allgemeinen, wie die Connection reset by peer
zu reproduzieren?
Sie senden einen Reset mit der Option SO_LINGER hier skizziert: http://stackoverflow.com/a/ 6440364/642070 – tdelaney
@tdelaney noch recv leere Zeichenfolge –
Es hat für mich funktioniert. Ich musste eine kurze Wartezeit im Server hinzufügen, damit die RST nicht mit der Verbindung zurückkommt. – tdelaney