我编写了一个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语句块之前正常工作,正确发送文本文件并关闭客户端和服务器。
如果设置为null,操作系统会自动分配InetAddress
/ SocketAddress
吗?
答案 0 :(得分:1)
您无法将InetAddresses与==进行比较。你需要调用equals()。
但你不需要这个。在获得第一个数据包时,只需将套接字连接到原始发件人即可。然后UDP将为您进行过滤。