2017-09-06 99 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调用的操作系统级别处理 –

相关问题