2017-09-06 110 views
0

我正在使用python套接字連接到服務器以進行日誌記錄。服務器的IP地址是x.x.x.x(我只是隱藏這個,x可以是從0到255的數字),並且我的域名可以是www.example.domain.com。我已經在/etc/hostssudo訪問中編寫了此x.x.x.x www.example.domain.com。但是,當我嘗試在我的程序中使用域名時,python套接字未能解析域名。爲什麼不能在這裏解析域名?

import socket 

mysocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
'''Block of code''' 
mysocket.sendto('Hello!', 'www.example.domain.com') 
mysocket.close() 

這裏的錯誤信息是:

socket.gaierror: [Errno 8] nodename nor servname provided, or not known

如果我改變www.example.domain.com以純文本的主機名,如testLogger,蟒蛇插座能解決這個問題。我可以在我的機器上使用ping域名,所以我只是想知道爲什麼python套接字無法在這種情況下解析域名。

+0

有什麼錯誤? –

+0

當您執行'socket.gethostbyname('www.example.domain.com')'時會發生什麼? – birryree

+0

在您更新的代碼中,sendto()中的地址是一個字符串,而不是元組 - 它也缺少一個端口號。 –

回答

2

你的代碼中有幾個錯誤:

您使用的是UDP套接字上的IP套接字原始sendto()。 此外,地址參數的格式不正確,它通常是一個元組(主機名,端口)。

所以,要麼建立一個適當的UDP套接字:

mysocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
mysocket.sendto(b'data', ('hostname', 9999)) 

或使用connect + send/sendall代替:

mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
mysocket.connect(('hostname', 9999)) 
mysocket.sendall(b'data') 
+0

好吧,所以只是另一個一般性問題,是'python3套接字'能夠默認解析域名? –

+0

python2和3之間沒有區別 –

+0

是的,他們這樣做,因爲它通常在處理套接字API調用的操作系統級別處理 –

相關問題