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()たが、役に立ちませんでした。助けていただければ幸いです。

EDIT: "Wrong sender"無限ループで印刷されます。クライアントとサーバーの両方を同じコンピューターで実行していますが、最初に受信したパケットは正常にファイルに書き込まれます。プログラムは、if ステートメントのブロックを追加する前に動作し、テキスト ファイルを正しく送信し、クライアントとサーバーの両方を閉じます。

InetAddress/ SocketAddressnull に設定すると、OS によって自動的に割り当てられますか?

4

1 に答える 1

1

InetAddresses を == と比較することはできません。equals() を呼び出す必要があります。

しかし、これは必要ありません。最初のパケットを取得したら、ソケットを元の送信者に接続するだけです。次に、UDP がフィルタリングを行います。

于 2013-10-25T04:33:37.357 に答える