1

我愿意在我的安卓移动设备上创建一个服务器和客户端程序。设备在同一个wifi网络上相互通信,因此,必须实现一些简单的扫描机制——客户端电话通过某种广播搜索服务器电话。

我做了什么:

我的协议 - 客户端电话在 wifi 上广播消息端口p ,服务器侦听端口p。当服务器收到广播消息时,它会发回一条消息,从而向客户端发现自己。

我的代码 - 我在我的应用程序上打开了一个广播套接字,它发送一条广播消息。同时,我的 PC 上有一个 python 脚本,它可以监听和回复——我使用 python 以便我的测试更容易——PC 上的 Wireshark,我可以看到所有内容

怎么了:

当我使用我的一部 Galaxy S 手机时,它可以工作并且我得到了回应。当我使用另一部 Galaxy S 手机时,它不起作用。

现在这就是我所知道的:工作的手机实际上有 Nexus ROM 版本。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:

好的!似乎我的代码和协议确实有效。事实证明,2.3.3 手机存在一些严重的 ARP 问题。经过一些重置后,它可以完美运行!

4

0 回答 0