2017-12-05 7 views
0

Hy人、(Python/TFTP-Server)既存のIPアドレス(RNDIS)を聞く方法を教えてください。

私の問題:存在しないIPアドレスの(tftp)サーバを起動したいと思います。 実際にネットワークトラフィックが発生したときにそのIPアドレスが本質的に存在するUSB​​/RNDIS用のサーバーですが、Windowsを起動するときなどにサーバーを「早く」起動したいと考えています。

アイデアは、ソケットを0.0.0.0にbind()した後、 "有効な"アドレスの各要求をチェックすることでした。

このアプローチの問題:recfrom()は送信元アドレス(クライアント)のみを返しますが、送信先(サーバー)は返しません!

このクライアントが話したIPアドレスを取得するにはどうすればよいですか? (もちろん、少なくとも同じサブネットを確認できますが、このクライアントが話していた実際のサーバーアドレスが必要です)。

または、偶然にもbind()既存のIPアドレス?

歓声。

p.s. これはPythonのtftpyサーバのためのものです... - サーバを起動するときにクライアント側からpingする必要があるのはかなりですが...

答えて

1

ローカルアドレスを直接取得する方法はありませんが通常はあなたのために働くトリックがあります。

バッファとクライアントのアドレスがちょうどrecvfromから取得されたとします。今度は新しい補助UDPソケットを作成し、connectをクライアントのアドレスに作成してからgetsocknameを使用して、この新しいソケットのローカルアドレスを取得します。 (UDPでは、connectが実際にピアには何も送信しません、それだけでアドレス解決を行います。)

だから、このように、あなたはソースはそれがあったように、サーバシステムを使用するIPアドレスを発見することができますデータグラムをクライアントシステムに送り返します。これは、通常、クライアントがサーバーのターゲットに使用したのと同じアドレスです。

>>> cbytes, caddr = server_sock.recvfrom(2048) 
>>> print(caddr)       # Client IP and port 
('192.168.0.11', 38869) 

>>> aux_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
>>> aux_socket.connect((caddr[0], 9999)) # Connect back to client (port doesn't matter) 
>>> saddr = aux_socket.getsockname()  # Get local IP and port (ignore port here too) 
>>> print(saddr) 
('192.168.0.12', 39753) 

これはlinuxで動作します。私はそれがWindows上で同じように動作することを100%確信しているわけではありませんが、期待するのは妥当と思われます。

+0

ありがとうございました! ポートが問題ではない場合、なぜrecfrom()のポートを使用しないのですか? 様:[コード] バッファ、RADDR = recfrom(...) test_sock = socket.socket(...) test_sock.connect(RADDR) ... [/コード]一つはない そのよう使用されていないが、通話に必要なポートを考える必要があります;) –

+0

素晴らしい、ありがとう! ポートが問題ではない場合、なぜrecfrom()のポートを使用しないのですか? >>>バッファ、RADDR = recfrom(...) >>> test_sock = socket.socket(...) >>> test_sock.connect(RADDR) >>> ... :様 その方法は、使用されていないが、呼び出しに必要なポートを考える必要はありません;) –

+0

なぜこの愚かなフォーマットは全く機能していませんか? –

関連する問題