python3で低水準なsocket通信をしようと試みてハマッたことの備忘録です。
「python3 socket」等で検索をかけると簡単なsocket通信のサンプルコードが出て来ます。
<参考>
【Python3】Pythonでソケット通信を試してみた | DevelopersIO
※コードは上記ブログのものをそのまま拝借なのでここでは載せません。
コピペして自分のサーバー内で通信して接続し、「なるほど!」と納得。簡単簡単!
過去にJavaでやったことあるので理解出来ますよ!っと。
さて外部からアクセスしようとすると。。。
raceback (most recent call last):
File "test_socket_client.py", line 8, in <module>
s.connect( ( target , 123 ) )
ConnectionRefusedError: [Errno 111] Connection refused
というエラーに遭遇しました。
あれ?ポートは開放しているハズなのにおかしいな?
そもそも、
この.bindで指定しているIPって何なのさ?
s.bind( ( socket.gethostname() , 123 ) )
ということで、このsocket.gethostname()の部分をローカルに変更
[127.0.0.1]
[localhost]
としても繋がらない^^ん〜?
じゃあールーターのアドレス?
[192.168.0.1]
としても繋がらない。。。
じゃあDNS?
[接続先のDNS]
[サーバーのDNS]
[接続先のIPアドレス]
いろいろ試したけど繋がらない・・・
ググってもローカルIPアドレスしか書いて無い!?
なんだこれ???
諦めずに調べていくと答えを発見!
なんと、通常は「オールゼロ」というIPアドレスを設定するそうです。
[0.0.0.0]
これでOK。
s.bind( ( '0.0.0.0' , 123 ) )
ここでようやく意味を理解しました。
ここで設定してるIPアドレスはルーターからLANアダプタに割り振られたIPアドレスのことのようです。
なるほど!どのLANアダプタからの情報を繋ぐか?ということなので通常はオールゼロ設定で問題無いですね。
こんな事に時間を費やしてしまって悲しい。。