2010-06-19 37 views
0

我試圖做一個簡單的服務器/客戶端程序對套接字。 在局域網他們工作正常,但是當我嘗試從「外部」連接它說連接被拒絕。我關閉了兩臺機器上的防火牆,但我仍然無法連接,並且我仔細檢查了IP。我無法連接從外面

我到底做錯了什麼?

感謝

傑克

代碼:

import socket 
host = '' 
port = 9888 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port))  
s.listen(1) 
conn, adrr = s.accept() 
conn.send("Hello, world!") 
s.close() 

Client: 
import socket 
host = '68.x.x.x' 
port = 9888 
s = socket.socket(socket.AF_INET, socket_SOCK_STREAM) 
s.connect((host,port)) 
print s.recv(200) 
s.close() 
+0

你能告訴我你的代碼嗎? – 2010-06-19 22:03:11

+1

您是否已經轉發了路由器中所需的端口? – Felix 2010-06-19 22:07:02

+0

您確定您正在連接到本機(例如,不在中間的路由器)? – Stephen 2010-06-19 22:08:35

回答

2

你有兩種可能的問題之一。

  1. 錯誤的網絡配置
  2. 錯誤(收費)代碼

調試這個問題的方法是嘗試和規則一出。如果我們可以擺脫代碼問題,那麼我們知道這是一個網絡問題。

獲取套接字服務器和客戶端,你知道的作品,然後嘗試他們作爲獨立的程序。在防火牆的內部和外部。 Go to this site並下載示例。更改客戶端和服務器端口,編譯並運行它們。首先在網絡內的同一臺計算機上,其次從同一網絡上的兩臺計算機,然後從內部服務器和外部網絡客戶端。

1

怎麼是你傳遞給.bind呼叫服務器socket的說法?這是唯一可能的原因 - 例如如果你使用192.168.x.yxy,或10.x.y.z同樣任何值,這只是,不通過互聯網公約網間路由器路由(大多數路由器可以通過編程來一些進入的數據包轉發到特定的本地網絡地址本地網絡地址,通常取決於端口,但這是路由器的品牌和型號特有的)。

+0

所以基本上我必須轉發端口? – Jake 2010-06-19 22:16:31

+0

@Jake,除非您的計算機在公共子網上使用可從外部訪問的靜態IP(即** not ** 192.168.etc或10.etc),否則從您的路由器進行端口轉發(誰擁有_better_)一個可從外部訪問的公共IP - 如果不是靜態的,你可以使用dyndns或類似的服務來改善)。有關更多詳細信息,請參閱superuser.com,因爲「我如何最好地在此特定型號的路由器上獲取端口轉發」本身不是一個編程問題。 – 2010-06-19 22:19:47

+1

@Jake:是的。很可能您在本地使用「RFC1918」地址(這是IETF標準提案文檔,討論了用於隔離網絡的保留地址集,並且這些地址多年來一直用於執行NAT(網絡地址轉換)在小型和家庭局域網和互聯網之間的邊界 由於各種原因,您的ISP有可能通過其路由基礎設施阻止幾乎任意端口和流量類型的列表,這對於更好的ISP而言並不常見,並且更常見於有線公司,例如。 – 2010-06-19 22:23:09