DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

python3のsocket通信で外部からアクセスさせるためには「オールゼロ」”s.bind(( '0.0.0.0' , [ポート番号] )) ”を使う 備忘録

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アドレスしか書いて無い!?

なんだこれ???

 

諦めずに調べていくと答えを発見!

teratail.com

 

なんと、通常は「オールゼロ」というIPアドレスを設定するそうです。

[0.0.0.0]

これでOK。

s.bind( (  '0.0.0.0' , 123 ) )

 

ここでようやく意味を理解しました。

ここで設定してるIPアドレスはルーターからLANアダプタに割り振られたIPアドレスのことのようです。

f:id:DreamerDream:20210617165130p:plain

 

なるほど!どのLANアダプタからの情報を繋ぐか?ということなので通常はオールゼロ設定で問題無いですね。

 

こんな事に時間を費やしてしまって悲しい。。

kampa.me