質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

14833閲覧

Pythonで異なるPC間でsocket通信するときのIPアドレスは何にしたらいいですか?

qope

総合スコア16

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/07/29 03:11

編集2018/07/29 03:28

前提・実現したいこと

pythonでp2p式のチャットアプリを作ろうとしています。

異なるpc間でsocketのTCP通信でメッセージをやり取りしたいです。

わからない点は、サーバー側のipアドレスを何にするかです。これまで、以下のコードのmy_ipのところを"localhost"にしており、同じパソコンからだと問題なく通信できていました。

別のパソコン同士で通信するときはmy_ipをglobal ipアドレスに設定するのでしょうか?

http://ipcheck.ieserver.net/にアクセスしてglobal ip アドレスを取得し、サーバーを立ち上げるプログラムを書いたところ、以下のエラーに遭遇しました(client.py実行前)

発生している問題・エラーメッセージ

Traceback (most recent call last):
File "server.py", line 8, in <module>
s.bind((my_ip, 50007))
OSError: [WinError 10049] 要求したアドレスのコンテキストが 無効です。

該当のソースコード

server.py

python

1import socket, requests 2s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 3res = requests.get('http://ipcheck.ieserver.net/') 4my_ip = str(res.text.rstrip("\n")) 5s.bind((my_ip, 50007)) 6s.listen(1) 7c, a = s.accept() 8msg = c.recv(1024) 9print(msg.decode()) #client.pyを実行するとfooが表示されてほしい

client.py

python

1import socket, requests 2s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 3res = requests.get('http://ipcheck.ieserver.net/') 4my_ip = str(res.text.rstrip("\n")) 5s.connect((my_ip, 50007)) 6s.send("foo".encode())

試したこと

Windowsのファイアウォールで50007ポートのTCP通信を許可しました

補足情報(FW/ツールのバージョンなど)

環境:Windows10 Anaconda
ウイルス対策ソフトは入っていません(Windows Defenderのみ)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

bindで指定するのは、自分のLANアダプタのIPアドレスです。普通はオールゼロ"0.0.0.0"で良いです。
オールゼロ以外を指定するのは、LANアダプタのIPアドレスが複数あるときに、そのうちの1つのIPアドレスからのリクエストしか受け付けたくないときにその受け入れるIPアドレスを指定します。

ある家庭XのPC-Aと、別の家庭YのPC-Bで通信したいという事であれば、それぞれの家庭のルーターでいわゆるポート開放という設定が必要です。
PC-Aから接続に行くのは、家庭Yのグローバルアドレスです。家庭YのルーターでPC-Bに行くようにポート開放します。

投稿2018/07/29 03:42

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qope

2018/08/02 13:42

ご回答ありがとうございます。 bindには自分のIPアドレスを指定すると勘違いしておりました。 教えていただいた通り、bindに0.0.0.0を指定し、ポート開放すると、無事インターネット越しに通信できました。 ありがとうございます。
guest

0

IPアドレスはPythonの中だけで使用されるものではありません。現用のIPアドレスを調べた上で、これを流用するのが通常です。

プライベートネットワークならばipconfigコマンドで調べられます。グローバルIPを使うならばルータ等の設定も必要です。

投稿2018/07/29 06:43

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qope

2018/08/02 14:00

ご回答ありがとうございます。 Windowsのファイアウォールの設定を変えるだけで大丈夫だと思っていましたが、ルーターのほうも設定しなければならないんですね。 ありがとうございます。
guest

0

まずは自分のLAN内での通信を実装してみては。
別のPCを持ってきて、それぞれどういうIPが割り当てられてるか調べて、それを設定して通信してみればどうでしょう。

いきなりインターネットを介しての通信ってのはハードルが高いです

で、同じLAN内から自分のドメイン/自分のグローバルIPへのアクセスってのは基本できません

投稿2018/07/29 05:51

編集2018/07/29 06:27
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qope

2018/08/02 13:56

ご回答ありがとうございます。 自分自身へのグローバルIPのアクセスはできないんですね!アドバイスいただいた通り、ローカルIPアドレスで試行錯誤して、IPアドレスに対する知識をつけたいと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問