私は、データグラム パケットを交換してパケットの破損と損失を修正する 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
/ SocketAddress
null に設定すると、OS によって自動的に割り当てられますか?