0
我想看看套接字如何工作,所以我瀏覽了HOWTO和docs,並試圖編寫我自己的代碼。服務器端是這樣的:使用套接字連接通過主機名工作,但不是所有端口
ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
assert socket.gethostname() == HOST
ssock.bind((HOST, PORT))
ssock.listen(5)
while True:
csock, address = ssock.accept()
print('Accepted connection from', address)
t = threading.Thread(target=server, args=(csock,))
t.start()
的客戶端是:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
這些都是在一個模塊中,所以常數是相同的。這不起作用。當我嘗試連接時,我收到一個ConnectionRefusedError: [Errno 111] Connection refused
。
無論其:
當我嘗試通過主機連接到另一個端口,它的工作原理:
In [4]: s.connect((HOST, 22)) In [5]: s.recv(1024) Out[5]: b'SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1\r\n'
(顯然,這不是我的應用程序處理服務器上的連接)。
當我將主機名更改爲服務器代碼中的本地IP地址時,我也可以連接到我的端口(使用IP作爲主機字符串)。
這些情況的組合困擾我。誰能解釋這種行爲?
編輯:好像我可以連接HOST
如果我也在服務器代碼中使用IP。但爲什麼它不像HOWTO那樣工作?
從HOWTO:「如果我們使用's.bind(( '',80))'[...]我們仍然有「服務器」套接字,但只能在同一臺機器上看到的套接字。「 - 不正確嗎? 「 –
」「和」0.0.0.0「應綁定到所有可用接口。 'ss -lntp'對列出偵聽套接字非常有用。 –
它確實有用,你和@ t-8ch是對的,而且HOWTO不是,至少我是這樣理解的。謝謝。我認爲我應該把這一個標記爲接受。 –