2

我正在创建一个服务器(现在称为 Server1),它正在与我拥有的另一台服务器(现在称为 Server2)进行通信。

  • Server1 向Server2 发送一个数据报包。
  • Server2 应该发回两个数据报包,但我只收到一个。
  • server2没有问题,发了两个包。

我使用 Wireshark 来嗅探离开和到达 Server1 的包。

套餐一(来自wireshark):“5955 11994.023974 192.168.1.3 192.168.1.2 UDP Source port: 50000 Destination port: 50004”

包二(来自wireshark):5958 11994.045830 192.168.1.3 192.168.1.2 ICMP Destination unreachable(端口不可达)

Server1 运行一个正在侦听数据报包的线程。

代码服务器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);
}

我是否必须使用服务器套接字来使其侦听多个数据报包?

摘要: - 端口不可达 - 无法接收第二个包

希望可以有人帮帮我。提前致谢

4

1 回答 1

1

第一个问题,正如在问题的评论中已经提到的那样,是您假设以下两行是正在发送的两个 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 数据包,从 server2 (192.168.1.3) 到 server1 (192.168.1.2)。它被发送到 server1 上的端口 50004。

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

这是从 server2 发送到 server1 的控制消息,说明由于目标端口未打开,无法传递先前的数据包。这是先前从 server1 到 server2 的数据包传递尝试的答案,但没有成功。这可能有助于解释为什么您没有收到您期望的所有数据包?

于 2010-01-22T13:32:55.657 回答