簡體   English   中英

socket.error:[Errno 111]嘗試連接套接字時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM