当前位置: 首页 > 知识库问答 >
问题:

从同一台计算机上的同一端口发送数据和确认

龙志勇
2023-03-14

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

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

    < li >客户端需要侦听收到的数据包 < li >服务器需要监听客户端的确认信息

…以及两个分别用于发送数据和确认的套接字,也共享一个端口。

这通常发生在同一个端口上,但在不同的机器上。有没有办法绕过这个问题,让客户端和服务器在同一个主机上和平工作,没有任何丑陋的黑客攻击?我所说的丑陋的黑客攻击是指:

> < Li > ACK通信端口的预定义偏移量(如数据端口上的15;这是我现在正在使用的。它可以工作,但感觉不对,而且容易出错) < li>

重复关闭和打开套接字(发送数据,关闭用于发送数据的套接字,以便客户端可以使用该端口发送其ACK等。);目前这也能工作,但也是通过黑客手段。例如,下面是我如何“重新打开”一个用于发送信息的套接字:

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

这是邪恶的。我的套接字最初接收动态分配的临时端口号。然后,我记住这个值,并用它将我的套接字“恢复”到旧端口。但是,不能保证该端口仍然可用。通常是这样,但不能保证。在这种情况下,我是不是过于多疑了?

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

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

共有1个答案

章锦
2023-03-14

客户端不需要使用固定的端口号。只需将其绑定为零。服务器应将响应发送回始发客户端,无论其端口号如何。

 类似资料:
  • 问题内容: Python网站上是否有官方文档,内容涉及如何在Linux的同一台计算机上安装和运行多个版本的Python? 我可以找到成千上万的博客文章和答案,但是我想知道是否有“标准”的官方方式来做到这一点? 还是全部取决于操作系统? 问题答案: 我认为这是完全独立的。只需安装它们,然后即可使用命令例如和。链接到您要用作默认值的那个。 无论如何,所有库都位于单独的文件夹中(以版本命名)。 如果要手

  • 我的计算机上安装了Python 3.7。我想使用tensorflow,但刚刚发现它基本上不支持3.7,所以我想(也)安装Python 3.6。 有什么建议吗?我是否必须卸载3.7并将其替换为3.6,或者是否有办法仅将3.6用于与tensorflow相关的内容?

  • 问题内容: 与Windows和Linux上的命名管道和其他方法相比,在执行IPC时使用套接字的效率如何? 现在,我在4个需要通讯的单独盒子上有4个单独的应用程序。两个是在Windows Server 2003 R2上运行的.NET 3.5应用程序。两个是Linux(Suse Linux 10)。它们通常不受CPU限制。流量不是很大,但是很重要的一点是低延迟。我们现在使用的套接字已禁用nagle,并

  • 我一直试图通过按钮单击(mRescue)在我的数据库(Emergency_Contact)中发送自定义消息,当单击按钮时,它将检查在签入之后按下按钮的人的对于每个拥有作为他们的孩子的人,如果他们拥有作为他们的孩子,它会向他们发送消息,否则它会返回Toast消息。我试图运行我的代码,但它崩溃了,我不知道为什么。这是我的活动,执行此操作。 如何发送此消息? 这是我的logcat

  • 导入java.rmi.RemoteException;导入java.util.properties;导入javax.ejb.createException;导入javax.naming.context;导入javax.naming.InitialContext;导入javax.naming.namingException;导入com.brainysoftware.ejb.adder;导入com.b

  • 我正在Unity中制作一个游戏,我试图将数据从客户端发送到服务器并返回到客户端(试图保存实例),但当我收到数据并尝试将数据发送回客户端时,它表示udp客户端未连接。 它成功地将数据从我的Unity客户端发送到服务器,但一旦它到达那里,套接字就会断开连接,我就无法返回任何内容。正如你所看到的,我试图设置一些多播选项,但它似乎不能正常工作。 客户: 服务器: 因此,服务器中UdpClient的实例会保