ConnectionResetError: [Errno 54] Connection reset by peer

問題現象: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()。

這裏面深層次的邏輯是:

  1. socket模塊封裝了TCP/IP各種協議,方便應用層進行程序編寫。
  2. server端的socket負責接收,通過TCP3次握手獲得了與client端的聯繫。
  3. server端的socket中的sock與client端的socket實際上是同一機制,因此可以互相send和resv
  4. server端的socket listen了很多sock,用來和不同的client通信。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章