2011-03-18 106 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