2013-10-25 2 views
0

Я написал программу клиента/сервера Java RDT, которая обменивается пакетами датаграмм, чтобы исправить повреждение и потерю пакетов. Последний бит добавляемого кода требует, чтобы я сравнивал исходный адрес каждого пакета с адресом исходного пакета.Как подтвердить адрес источника пакета датаграммы?

//global 
    InetAddress originalSender; 

    //C'tor 
    originalSender = null; 

     ... 


//primary method 
    public byte[] rdt_receive() throws IOException 
     { 
      while (true) { 

       DatagramPacket recPacket = new DatagramPacket(new byte [PACKET_SIZE], PACKET_SIZE); 
       dgSock.receive(recPacket); 

       if (originalSender == null) { 
        System.out.println("Address is set!\n"); 
        originalSender = recPacket.getAddress(); 
       } 

       if(originalSender != recPacket.getAddress()) { 

        System.out.println("Wrong sender!"); 
        sendAck((short) (expectedSequence == 0 ? 1 : 0), recPacket.getSocketAddress()); 
        continue; 
       } 
    // continue method... 

"Address is set" никогда не печатается так if(originalSender == null) никогда не возвращает истину, даже для первого пакета. Я также пробовал SocketAddress и .getSocketAddress() безрезультатно. Помощь очень ценится.

EDIT: "Wrong sender" напечатан в бесконечном цикле. Я запускаю как клиент, так и сервер на одном компьютере, и первый полученный пакет успешно записывается в файл. Программа работает до добавления блока операторов if, правильной отправки текстового файла и закрытия как клиента, так и сервера.

Действительно ли InetAddress/SocketAddress автоматически назначается ОС, если установлено значение null?

+0

Вы уверены, что получаете что-либо вообще? Положите распечатку после '.receive()' – iluxa

+0

Спасибо, да, она получает. Я редактировал сообщение. – geg

+0

Почему вы печатаете «адрес установлен», если это не так? – EJP

ответ

1

Вы не можете сравнить InetAddresses с ==. Вам нужно вызвать equals().

Но это вам не нужно. Просто соедините() сокет с исходным отправителем, когда вы получите первый пакет. Тогда UDP сделает фильтрацию для вас.

+0

Полезно знать, что сработало. Знаете ли вы причину для сравнения InetAddress непосредственно в методе, а не с оператором? Спасибо за помощь. – geg

+0

То же самое для String и любого другого класса на Java. Ничего особенного в InetAddress. Перегрузок оператора == нет. – EJP

Смежные вопросы