【问题标题】:How to confirm datagram packet source address?如何确认数据报包源地址?
【发布时间】:2013-10-25 12:33:37
【问题描述】:

我编写了一个 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)永远不会返回 true,即使是第一个数据包也是如此。我也试过SocketAddress.getSocketAddress() 无济于事。非常感谢您的帮助。

编辑: "Wrong sender" 在无限循环中打印。我在同一台计算机上同时运行客户端和服务器,并且第一个接收到的数据包已成功写入文件。该程序在添加 if 语句块、正确发送文本文件并关闭客户端和服务器之前运行。

InetAddress/SocketAddress 如果设置为 null,是否由操作系统自动分配?

【问题讨论】:

  • 你确定你收到了什么吗?在 '.receive()' 之后打印输出
  • 谢谢,它确实收到了。我已经编辑了帖子。
  • 为什么要打印“地址已设置”而不是?

标签: java udp datagram


【解决方案1】:

您无法将 InetAddresses 与 == 进行比较。你需要调用equals()。

但你不需要这个。当您收到第一个数据包时,只需将套接字连接()到原始发送者。然后UDP会为你做过滤。

【讨论】:

  • 很高兴知道,这行得通。知道直接在方法中而不是使用运算符实现 InetAddress 比较的原因吗?感谢您的帮助。
  • String 和 Java 中的所有其他类都是一样的。 InetAddress 没有什么特别之处。 == 运算符没有重载。
  • “==”不只是检查指针等价吗? IE。这两个变量指向同一个对象吗?
猜你喜欢
  • 2017-05-13
  • 2011-01-30
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2014-02-04
相关资源
最近更新 更多