1

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 問題があったことが判明しました。いくつかのリセット後、問題なく動作します!

4

0 に答える 0