2011-03-18 105 views
1

我试图在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应用程序,而不是在模拟器

+0

我想我找到了。 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

+0

你使用哪个端口?接收方可以接收你的数据?你的身边无法从接收方获取数据?应该使用端口> 1024来避免系统服务端口,例如。端口u可以使用的是10000发送数据,端口10001接收数据 – 2014-12-19 02:26:31

回答

1

主要的问题是在这line:

DatagramSocket socket = new DatagramSocket(getPort()); 

假设设备的本地主机与机器/计算机相同,但设备拥有自己的网卡,因此在任何网络中都有自己的IP,并且拥有自己的网络IP地址拥有。该设备无法通过您的机器的一个端口到达。

+0

看,我发送来自服务器的广播请求,在所有本地设备上。我试过DatagramSocket socket = new DatagramSocket(getPort(),“192.168.1.255”),例如...但结果是一样的。 – Lunatik 2011-03-18 21:21:01

+0

尝试在模拟器中运行它,看看你是否得到任何不同的结果。我知道模拟器需要使用另一个IP才能与映射到它的主机进行通信。另外,当你的电脑连接到你的电脑时,你的HTC是否属于你的网络? – 2011-03-18 23:05:14

+0

是的,宏达电是一个部分,它连接到无线网络,它在本地网络中拥有自己的IP。 “尝试在模拟器中运行它,看看你是否得到任何不同的结果” - 将尝试。 – Lunatik 2011-03-19 06:14:35