問題現象:ConnectionResetError: [Errno 54] Connection reset by peer
問題描述:筆者在進行socket編程時遇到該問題
問題原因:對於server端和client端的參數認識不夠。
client端傳給server端,由於client端的addr是固定的,因此無論是send還是recv,只需要s.send() s.recv()就好。
但是對於server端,是有2類參數的,其格式是:
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 49362)> ('127.0.0.1', 49362)
所以實際操作的時候要區分:
sock, addr = s.accept()
接受和發送需要sock.send()和sock.recv(),而不是s.send()和s.recv()。
這裏面深層次的邏輯是:
- socket模塊封裝了TCP/IP各種協議,方便應用層進行程序編寫。
- server端的socket負責接收,通過TCP3次握手獲得了與client端的聯繫。
- server端的socket中的sock與client端的socket實際上是同一機制,因此可以互相send和resv
- server端的socket listen了很多sock,用來和不同的client通信。