2017-09-06 7 views
0

私はPythonソケットを使用して、ログ記録用のサーバーに接続しています。サーバーのIPアドレスはx.x.x.xです(私はこれを隠すだけです、xは0から255までの数字です)。私のドメイン名はwww.example.domain.comです。私はこのx.x.x.x www.example.domain.com/etc/hostssudoと書いています。しかし、プログラムでドメイン名を使用しようとすると、pythonソケットはドメイン名を解決できませんでした。なぜpythonソケットでドメイン名を解決できないのですか?

import socket 

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

ここでエラーメッセージは次のとおりです。私はプレーンテキストホスト名などtestLoggerwww.example.domain.comを変更した場合は

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

、Pythonのソケットがそれを解決することができます。私はping私のマシン上のドメイン名をすることができます。だから、このシナリオでなぜpython socketがドメイン名を解決できないのか不思議です。

+0

エラーは何ですか? –

+0

'socket.gethostbyname( 'www.example.domain.com')'を実行するとどうなりますか? – birryree

+0

更新されたコードでは、sendto()のアドレスはタプルではなく文字列であり、ポート番号もありません。 –

答えて

2

あなたのコードは、いくつかのミスがあります

あなたはIPソケットにsendto()プリミティブUDPソケットを使用しています。 また、addressパラメータの形式が不正です。通常はタプル(ホスト名、ポート)です。だから、

、いずれかの適切な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

さて、もう1つの一般的な質問ですが、 'python3 socket'はデフォルトでドメイン名を解決できますか? –

+0

python2と3の違いはありません –

+0

とはい、これは通常、ソケットAPI呼び出しが処理されるオペレーティングシステムレベルで処理されるため、これを行います –

関連する問題