在不同的Android手机上接收UDP会产生不同的结果

时间:2012-12-01 17:02:41

标签: android udp android-wifi galaxy

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

我做了什么:

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

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

会发生什么:

当我使用我的一款Galaxy S手机时 - 它有效并且我得到了回复。 当我使用其他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问题。 经过一些重置后,它可以完美运行!

0 个答案:

没有答案