Как я могу получить IP-адрес от многоадресного сокета, который прослушивает трансляции? - PullRequest
2 голосов
/ 03 декабря 2011

Мой сервер создает многоадресный сокет, который прослушивает UDP-пакеты.Он получает пакеты, отправленные на широковещательный адрес сети, но я не могу получить IP-адрес отправителя:

multisocket.getInetAddress().getHostAddress();

возвращает

"::" 

(думаю, это из-заnull getInetAddress).

Как я могу получить IP-адрес отправителя?

СОВЕТЫ: ​​Я полагаю, это связано с тем, что сокет не связан, и в основномвся широковещательная рассылка, потому что эти пакеты отправляются не мне, а всей сети, но должны ли они содержать IP-адрес отправителя?Просветите меня, пожалуйста.

Вот код:

public void run() {
    try {
        Thread.sleep(5000);
        Log.i("SERVERUDP", "Connecting...");
        MulticastSocket multisocket = new MulticastSocket(SERVERPORT);
        multisocket.setBroadcast(true);
        Log.i("SERVERUDP","Server's IP is: " + multisocket.getLocalAddress().getHostAddress());
        getLocalIpAddress();
        while(true){
            byte[] b = new byte[65535];
            ByteArrayInputStream b_in = new ByteArrayInputStream(b);
            DatagramPacket dgram = new DatagramPacket(b, b.length);
            multisocket.receive(dgram); // blocks
            ObjectInputStream o_in = new ObjectInputStream(b_in);
            Object o = o_in.readObject();
            dgram.setLength(b.length);
            b_in.reset();
            if(o.getClass().getSimpleName().equalsIgnoreCase("Request")){
                Request request = (Request)o;
                String inetaddress = multisocket.getInetAddress().getHostAddress();
                Log.i("SERVERUDP-if", "Sending request to IP: " + inetaddress);
                new Thread(new ClientTCP(inetaddress, createRequestFromBroadcast(request))).start();
            }else if(o.getClass().getSimpleName().equalsIgnoreCase("String")){
                Log.e("SERVERUDP-elseif-string", "WTF received a string: " + (String)o);
            }else{
                Log.e("SERVERUDP-else", "Unrecognized object of type: " + o.getClass().getSimpleName());
            }
            o_in.close();
            //iteration done only once for testing!
            break;
        }
        multisocket.close();
    } catch (Exception e) {
        Log.e("SERVERUDP", "Error", e);
    }
}

1 Ответ

6 голосов
/ 03 декабря 2011

Каждый полученный вами пакет может иметь другой адрес источника.Поэтому я не уверен, почему вы пытаетесь взглянуть на multisocket, чтобы выяснить адрес источника.

Я должен признать, что я не пробовал, но dgram.getSocketAddress () дает вам то, что выхотите после того, как multisocket.receive вызов вернется?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...