Проблема с сокетом Java, не прослушивает более одного пакета дейтаграмм - PullRequest
2 голосов
/ 22 января 2010

Я создаю сервер (теперь называемый Server1), который обменивается данными с другим сервером, который у меня есть (теперь называется Server2).

  • Сервер1 отправляет пакет данных на Сервер2.
  • Сервер2 должен отправить два пакета дейтаграмм назад, но я получаю только один обратно.
  • Сервер2 не является проблемой, и отправляет два пакета.

Я использую Wireshark, чтобы прослушать пакеты, которые отправляются на сервер Server1.

Пакет 1 (из проволоки): «5955 11994.023974 192.168.1.3 192.168.1.2 UDP Source порт: 50000 Порт назначения: 50004 "

Пакет 2 (от Wireshark): 5958 11994.045830 192.168.1.3 192.168.1.2 Назначение ICMP недоступно (порт недоступен)

Сервер1 запускает поток, который прослушивает пакеты дейтаграмм.

Код сервера1:

     while (m_keepRunning)
    {
        try
        {
         TermMsg receivedMessage = null;
         receivedMessage = receive();   //See this function further down
         if (receivedMessage != null)
            {
                if (receivedMessage.getMsgType().equals(TermMsgType.ACK))
                {
                 System.out.println("This is an ack!");
                }
                else
                {

                 System.out.println("This is a response");
                }
            }
         else
         {
          System.out.println("This is nothing");
         }

        }

Функция получения:

      private TermMsg receive() throws IOException, TermMsgException
{
  byte[] inBuf = new byte[BUF_SIZE_RX];
  DatagramPacket inData = new DatagramPacket(inBuf, BUF_SIZE_RX);

    if(true == firstEncounter)
    {
            StartMessage startReq = getStartMsg(false);
     DatagramPacket p = makeDatagramP(startReq);
     socket.send(p);
     firstEncounter = false;
    }

    socket.receive(inData);
    if (inData.getLength() > 0)
    {
        Msg msg;
        try
        {
            msg = Msg.createFromUdp(inData.getData());
            return msg;
        }
        catch (TermMsgException e1)
        {
            return null;
        }
    }
    else
    {
     try
        {
            Thread.sleep(100);
        }
        catch (InterruptedException e)
        {

        }
        return null;
    }
}

У кого-нибудь есть подсказка? кстати ... я также использую:

DatagramSocket socket;
try {
  socket = new DatagramSocket(50004);
}

Нужно ли использовать сокет сервера, чтобы он прослушивал более одного пакета дейтаграмм?

Резюме: - Порт недоступен - Не могу получить пакет номер два

Надеюсь, кто-нибудь может мне помочь. Заранее спасибо

1 Ответ

1 голос
/ 22 января 2010

Первая проблема, как уже упоминалось в комментариях к вопросу, заключается в том, что вы предполагаете, что следующие две строки - это два отправляемых UDP-пакета.

Package one(from wireshark): "5955 11994.023974 192.168.1.3 192.168.1.2 UDP Source port: 50000 Destination port: 50004"

Package two(from wireshark): 5958 11994.045830 192.168.1.3 192.168.1.2 ICMP Destination unreachable (Port unreachable)

На самом деле, это, вероятно, неполная трассировка, поскольку здесь показаны два пакета:

Package one(from wireshark): "5955 11994.023974 192.168.1.3 192.168.1.2 UDP Source port: 50000 Destination port: 50004"

Это пакет UDP от сервера 2 (192.168.1.3) до сервера 1 (192.168.1.2). Он отправляется на порт 50004 на сервере 1.

Package two(from wireshark): 5958 11994.045830 192.168.1.3 192.168.1.2 ICMP Destination unreachable (Port unreachable)

Это управляющее сообщение, отправляемое с сервера2 на сервер1, в котором говорится, что предыдущий пакет не может быть доставлен, поскольку порт назначения не был открыт. Это ответ от предыдущей попытки доставки пакета с сервера1 на сервер2, которая не сработала. Это может помочь объяснить, почему вы не получаете все ожидаемые пакеты?

...