2013-02-03 99 views
0

我想看看套接字如何工作,所以我瀏覽了HOWTOdocs,並試圖編寫我自己的代碼。服務器端是這樣的:使用套接字連接通過主機名工作,但不是所有端口

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

無論其

  1. 當我嘗試通過主機連接到另一個端口,它的工作原理:

    In [4]: s.connect((HOST, 22)) 
    
    In [5]: s.recv(1024) 
    Out[5]: b'SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1\r\n' 
    

    (顯然,這不是我的應用程序處理服務器上的連接)。

  2. 當我將主機名更改爲服務器代碼中的本地IP地址時,我也可以連接到我的端口(使用IP作爲主機字符串)。

這些情況的組合困擾我。誰能解釋這種行爲?

編輯:好像我可以連接HOST如果我也在服務器代碼中使用IP。但爲什麼它不像HOWTO那樣工作?

回答

3

綁定到 「」,而不是主持人:

ssock.bind(("", PORT)) 
+1

從HOWTO:「如果我們使用's.bind(( '',80))'[...]我們仍然有「服務器」套接字,但只能在同一臺機器上看到的套接字。「 - 不正確嗎? 「 –

+0

」「和」0.0.0.0「應綁定到所有可用接口。 'ss -lntp'對列出偵聽套接字非常有用。 –

+0

它確實有用,你和@ t-8ch是對的,而且HOWTO不是,至少我是這樣理解的。謝謝。我認爲我應該把這一個標記爲接受。 –

相關問題