在android上无法接收UDP数据包?
我试图在Android上实现UDP服务器,我可以发送数据包到服务器,但无法接收它。另外我试图运行没有android的接收器,它的工作原理。哪里有问题?在android上无法接收UDP数据包?
试验本地发信人:
int send_packet(uint8_t* data) {
int retcode;
int socket_out;
int broadcast = 1;
struct sockaddr_in addr;
socket_out = socket(AF_INET, SOCK_DGRAM, 0);
if (socket_out < 0)
return -1;
setsockopt(socket_out, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof broadcast);
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
addr.sin_port=htons(PORT_NUMBER);
retcode = sendto(socket_out, data, sizeof(packet_data_t), 0,
(struct sockaddr *) &addr, sizeof(addr));
perror("sendto");
close(socket_out);
return 0;
}
Android的接收器:
public void run(){
try {
byte[] buffer = new byte[BUFFER_SIZE];
DatagramSocket socket = new DatagramSocket(getPort());
//socket.setBroadcast(true);
while(true){
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
(new CallbackWrapper(getPacketReciever())).run();
}
} catch (IOException e) {
e.printStackTrace();
}
}
PS我正在我的上一个的HTC Legend应用程序,而不是在模拟器
主要的问题是在这line:
DatagramSocket socket = new DatagramSocket(getPort());
假设设备的本地主机与机器/计算机相同,但设备拥有自己的网卡,因此在任何网络中都有自己的IP,并且拥有自己的网络IP地址拥有。该设备无法通过您的机器的一个端口到达。
看,我发送来自服务器的广播请求,在所有本地设备上。我试过DatagramSocket socket = new DatagramSocket(getPort(),“192.168.1.255”),例如...但结果是一样的。 – Lunatik 2011-03-18 21:21:01
尝试在模拟器中运行它,看看你是否得到任何不同的结果。我知道模拟器需要使用另一个IP才能与映射到它的主机进行通信。另外,当你的电脑连接到你的电脑时,你的HTC是否属于你的网络? – 2011-03-18 23:05:14
是的,宏达电是一个部分,它连接到无线网络,它在本地网络中拥有自己的IP。 “尝试在模拟器中运行它,看看你是否得到任何不同的结果” - 将尝试。 – Lunatik 2011-03-19 06:14:35
我想我找到了。 http://code.google.com/p/android/issues/detail?id=8407,http://www.flattermann.net/2010/09/fix-udp-broadcasts-on-htc-phones-running- stock-firmware/ – Lunatik 2011-03-20 06:18:26
你使用哪个端口?接收方可以接收你的数据?你的身边无法从接收方获取数据?应该使用端口> 1024来避免系统服务端口,例如。端口u可以使用的是10000发送数据,端口10001接收数据 – 2014-12-19 02:26:31