2011-03-18 3 views
1

안드로이드에 UDP 서버를 구현하려고했지만 서버로 패킷을 보낼 수는 있지만받을 수는 없습니다. 또한 안드로이드없이 수신기를 실행하려고, 그것은 작동합니다. 문제가 어디에 있습니까? 테스트를위한안드로이드에서 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; 
} 
안드로이드 수신기

: 내가하지 에뮬레이터에, HTC 전설에 내 응용 프로그램을 실행하고

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가

+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

+0

어떤 포트를 사용합니까? 수신 측에서 데이터를 수신 할 수 있습니까? 귀하의 측면에서 수신자 측의 데이터를 가져올 수 없습니까? 시스템 서비스 포트를 피하려면 포트> 1024를 사용해야합니다 (예 : 포트 u는 데이터를 보내려면 10000, 데이터를 수신하려면 포트 10001을 사용할 수 있습니다. –

답변

1

가장 큰 문제는이에 줄 :

DatagramSocket socket = new DatagramSocket(getPort()); 

장치의 로컬 호스트가 컴퓨터/컴퓨터와 같지만 장치에 자체 네트워크 카드가있어 결과적으로 네트워크에 자신의 IP가 있고 자신의 네트워크 주소 인 IP가 있다고 가정합니다 개인적인. 장치의 포트를 통해 장치에 연결할 수 없습니다.

+0

보세요, 저는 모든 로컬 장치에서 서버로부터 브로드 캐스트 요청을 보냅니다. 나는 DatagramSocket 소켓 = 새로운 DatagramSocket (getPort(), "192.168.1.255")를 사용하여 exmaple을 시도했지만 결과는 같습니다. – Lunatik

+0

에뮬레이터에서 실행하여 다른 결과가 나올지 확인하십시오. 필자는 에뮬레이터가 호스트 시스템과 통신하기 위해 다른 IP를 사용해야 함을 알고 있습니다. 또한, 귀하의 PC에 연결되어있을 때 귀하의 네트워크의 HTC 부분입니까? –

+0

네, HTC는 Wi-Fi와 연결되어 있으며 로컬 네트워크에 자신의 IP를 가지고 있습니다. "에뮬레이터에서 실행하여 다른 결과가 나오는지보십시오"- 시도합니다. – Lunatik

관련 문제