Android モバイル デバイスでサーバーとクライアント プログラムを作成したいと考えています。デバイスは同じ Wi-Fi ネットワーク上で相互に通信するため、単純なスキャン メカニズムを実装する必要があります。クライアントの電話は、ある種のブロードキャストを通じてサーバーの電話を検索します。
私がしたこと:
私のプロトコル - クライアントの電話は wifi でメッセージ ポートpをブロードキャストし、サーバーはポートpでリッスンします。サーバーはブロードキャスト メッセージを受信すると、メッセージを送り返します。これにより、サーバー自体がクライアントに検出されます。
私のコード - アプリでブロードキャスト ソケットを開き、ブロードキャスト メッセージを送信します。その間、リッスンして応答する python スクリプトが PC にあり、テストが簡単になるように python を使用しています。
何が起こるのですか:
Galaxy S フォンの 1 つを使用すると、動作し、応答が返されます。他の Galaxy S 電話を使用すると、機能しません。
これが私が知っていることです:実際に動作する電話にはNexus ROMが搭載されています Ver. 4.1.1 動作しない電話には 2.3.3 通常の Galaxy ROM があります
Python コードは、両方の電話から送信された両方のブロードキャストを受信し、例外を発生させずに両方に応答することを示しています。
これまでのところ、問題は 1. 古いバージョンの電話にあると考えられていました。2. Windows ファイアウォール 3. ルーター ファイアウォール
そこで、Wireshark を開きました。確かに、両方の電話がブロードキャストを送信していることがわかりました。これは Wireshark にログオンしていました。 しかし、python スクリプトは最初のスクリプトにしか応答しませんでした。 したがって、これが 1 と 3 が無関係である理由です。ルーターのファイアウォールが UDP をブロックしていた場合でも、古いバージョンの電話と同じように Python サーバーの応答が表示されます。
2を取り除くために、Windowsファイアウォールを無効にしました-それでも同じ問題です。
なぜこの効果が起こるのか、誰にも手がかりがありますか?
ありがとう!
編集
私のpythonコード:
def scan(data, addr, sock):
print "received scan message:", data, addr
name = u"name".encode("utf-16-le")
data = "DISC" + short2bytes(len(name)) + name
print "sending back %s to %s" % (data, addr)
sock.sendto(data, addr)
if __name__ == "__main__":
sock = socket(AF_INET, SOCK_DGRAM)
sock.bind(('', UDP_PORT))
while 1:
data, addr = sock.recvfrom(1500)
print "received packet " + data
if data.startswith("SCAN"):
scan(data, addr, sock)
編集2:
わかった!私のコードとプロトコル DID が機能しているようです。2.3.3 フォンにはいくつかの重大な ARP 問題があったことが判明しました。いくつかのリセット後、問題なく動作します!