从同一台机器上的同一端口发送数据和ACK

时间:2013-06-28 20:15:29

标签: java networking udp datagram tftp

我正在 Java 中实施TFTP (trivial FTP)协议。我有一个客户端和一个服务器,到目前为止,客户端可以请求一个文件,服务器会向他发送该数据。

这是我遇到问题的地方 - 出于明显的测试原因,我在我的机器上运行客户端和服务器。但是,在发送文件时,必须有两个套接字在同一端口上侦听:

  • 客户端需要侦听收到的数据包
  • 服务器需要监听客户端的确认

...还有两个用于发送数据和确认的套接字,也可以共享一个端口。

这通常发生在同一个端口上,但在不同的机器上。有没有办法解决这个问题,让客户端和服务器在同一台主机上安静地工作,没有任何丑陋的黑客攻击?丑陋的黑客我的意思是:

  • ACK通信端口的预定义偏移量(例如数据端口上的+15;这是我现在正在使用的。它有点工作但感觉不对且容易出错)
  • 反复关闭和​​打开套接字(发送数据,关闭套接字用于发送数据,以便客户端可以使用该端口发送他的ACK等);这也适用于此,但也通过黑客攻击。例如,这是我如何“重新打开”用于发送内容的套接字:

    public void open() {
        try {
            socket = new DatagramSocket(localPortCache);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
    

这是邪恶的。我的套接字最初接收动态分配的短暂端口号。然后我记住这个值并用它来“恢复”我的套接字到旧端口。但是,无法保证该端口仍可用。它通常是,但不能保证。在这种情况下,我是否过于偏执?

  • 在握手中生成新的ACK通信端口,并通过控制端口(69)在附加步骤中将其发送到客户端

更新

我设法解决了我的问题。我的问题是我没有尝试重用我的套接字。例如,我从端口X上的套接字发送了一些东西,但后来尝试在该端口上分配一个新的套接字来监听ACK,而不是仅仅重用旧的套接字。

1 个答案:

答案 0 :(得分:0)

客户端不需要使用固定端口号。只需将其绑定为零即可。无论端口号是什么,服务器都应将响应发送回原始客户端。