[英]socket.error: [Errno 111] when trying to connect to a socket
我試圖編寫一個代碼,其中客戶端在默認端口號上連接到服務器,然后服務器將另一個端口號發送到客戶端。 客戶端現在連接到新的端口號。
客戶:
import socket
import sys
import os
import signal
import time
s = socket.socket()
s.connect(("127.0.0.1", 6667))
line = s.recv(1024)
if line.strip():
port = int(line)
s.close()
soc = socket.socket()
soc.connect(("127.0.0.1", port))
print soc.recv(1024)
soc.close()
else:
s.close()
服務器:
import socket
import sys
import os
import signal
import time
port = 7777
s = socket.socket()
s.bind(("127.0.0.1", 6667))
s.listen(0)
sc, address = s.accept()
print address
sc.send(str(port))
sc.close()
s.close()
sock = socket.socket()
sock.bind(("127.0.0.1", port))
soc, addr = sock.accept()
print addr
soc.send("Success")
soc.close()
sock.close()
當我執行此代碼時,我在客戶端和服務器端遇到以下錯誤。
服務器:
('127.0.0.1', 36282)
Traceback (most recent call last):
File "server.py", line 17, in <module>
soc, addr = sock.accept()
File "/usr/lib/python2.7/socket.py", line 202, in accept
sock, addr = self._sock.accept()
socket.error: [Errno 22] Invalid argument
客戶:
Traceback (most recent call last):
File "client.py", line 13, in <module>
soc.connect(("127.0.0.1", port))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused
有人可以解釋這些錯誤的原因並為這些錯誤提供解決方案。
在您可以listen
TCP / IP套接字(基於連接的流套接字)之前,您需要使用bind
來分配套接字(使用socket.socket()
創建)。 然后你需要listen
為傳入連接做准備,然后最后你accept
准備好的套接字。
在調用sock.bind(("127.0.0.1", port))
之后,您似乎缺少sock.listen(0)
sock.bind(("127.0.0.1", port))
。 Python文檔的細節很簡短,但它確實說明了TCP / IP:
請注意,服務器必須執行序列socket() , bind() , listen() , accept() (可能重復accept()以服務多個客戶端),而客戶端只需要序列socket(),connect ()。 另請注意,服務器不會在正在偵聽的套接字上發送all()/ recv(),而是在accept()返回的新套接字上發送。
Python將其套接字模塊基於Berkeley Socket模型。 您可以在此鏈接中找到有關伯克利套接字的更多詳細信息。 特別是它說關於bind
:
bind()為一個地址分配一個套接字。 使用socket()創建套接字時,它僅被賦予協議族,但未分配地址。 在套接字可以接受與其他主機的連接之前,必須使用bind()系統調用執行與地址的關聯。
還要考慮如果客戶端在服務器開始偵聽連接之前收到端口號(並嘗試連接)會發生什么情況(在本例中為端口7777)。 雖然不是問題的原因,但我想指出完整性的情景。 您可能會考慮的事情是在您在端口7777套接字上調用listen
之后才關閉端口6667套接字。 在調用listen
您可以關閉第一個套接字。 在讀取端口后的客戶端上,您可以等到服務器關閉第一個連接(端口6667),然后連接到端口7777。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.