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

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

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

4

1 回答 1

1

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

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

于 2013-10-25T04:33:37.357 回答