Я написал программу клиента/сервера 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?
Вы уверены, что получаете что-либо вообще? Положите распечатку после '.receive()' – iluxa
Спасибо, да, она получает. Я редактировал сообщение. – geg
Почему вы печатаете «адрес установлен», если это не так? – EJP