我已经了解了tcp中两个臭名昭著的错误之间的区别:
当客户端第一次发送信息时,服务器会向客户端发送一个RST数据包,从此之后,每次发送信息都会报错“Broken pipe”。
我理解以上内容,但是当客户端从服务器读取信息时,它总是返回空字符串,而不是抛出“Connection reset by peer”的错误。
我对此感到困惑,或者说不知道如何重现“Connection reset by peer”的错误?
[Errno 54] Connection reset by peer
[Errno 32] Broken pipe
- 当另一侧
write
数据时,会抛出Broken pipe
异常 - 当另一侧
read
数据时,会抛出Connection reset by peer
异常
Broken pipe
异常。# 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)
关于客户端,
>>> 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
当客户端第一次发送信息时,服务器会向客户端发送一个RST数据包,从此之后,每次发送信息都会报错“Broken pipe”。
我理解以上内容,但是当客户端从服务器读取信息时,它总是返回空字符串,而不是抛出“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)
我对此感到困惑,或者说不知道如何重现“Connection reset by peer”的错误?