Pythonスクリプトを使用してサーバにUDPパケットを送信し、サーバからの通知を受信するスクリプトを登録します。プロトコルでは、これらの通知を受信する自分のIPアドレスとポートを送信する必要があるため、これはサーバーのネットワークから到達可能なアドレスにする必要があります。Python:特定のリモートIPアドレスにIPデータを送信するために使用されるローカルIPアドレスを取得します。
解決策は少なくとも私の開発プラットフォームであるため、Windows XP以上、好ましくはMac OS Xで動作するはずです。
最初の手順は、自分のインターフェイスのIPアドレスを取得することです。私は現在、マシンのホスト名を解決する一般的に提案されている方法を使用しています:
これは時々動作します。現在、172.16.249.1
を返します。これは、VM Wareで使用される仮想インターフェイスのアドレスです。したがって、これは問題です。
デフォルトのインターフェイスのIPアドレスを取得する方法は、ほとんどの場合、最も適切な方法です。
さらに、TCPのような接続指向のプロトコルによってサーバーに接続するために使用される実際のIPアドレスを取得する方法があります。私は実際にではなく、接続を開こうとせずに、そのアドレスを取得することができます:
def get_address_to_connect_to(server_addr):
non_open_port = 50000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((server_addr, non_open_port))
except socket.error:
pass
else:
s.close() # just in case
return s.getsockname()[0]
いくつかのTCPのタイムアウトはサーバが到達不能である場合には到達しているかの間で邪悪なファイアウォールがICMPをブロックされるまで、これはブロックします。パケット。その情報を入手するより良い方法はありますか?
ああ、甘い共感! 'SOCK_DGRAM'では、ほぼ完璧です!しかし 's.getsockname()'は私の場合は '(0.0.0.0 '、51770)'を返します。私は 's = socket.socket(socket.AF_INET、socket.SOCK_DGRAM)を試しました。 s.sendto(b'hello '、(' 1.2.3.4 '、50000)); s.getsockname()[0] '。あなたの答えにあなたのコードを追加すれば素晴らしいだろう! – Feuermurmel
私の答えを編集してください。 – DNS
これは完全に機能します。それは私が知らなかった[Discard Protocol](http://en.wikipedia.org/wiki/Discard_Protocol)を使っています!私は 'del s'を' with'ステートメントに置き換えました。 – Feuermurmel