- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的公司发布了一个用于特殊用途的特殊 TCP 堆栈,我的任务是实现符合 RFC793 的关闭序列。其中一个单元测试有一个服务器在特殊的 TCP 堆栈之上工作,与一个普通的 Linux TCP 客户端通信,我遇到了一些奇怪的行为,我不确定是我的编程错误引起的还是意料之中。
在我开始工作之前,我们曾经在用户应用程序调用 close() 时发送一个 RST 数据包。我已经实现了 FIN 握手,但我注意到在同时 TCP 终止的情况下(FIN_WAIT_1 -> CLOSING -> TIME_WAIT 在两端,见图),标准 Linux TCP 客户端无法连接到相同的目标地址和端口再次,connect() 返回 EADDRNOTAVAIL,直到 TIME_WAIT 进入 CLOSED。
现在,标准的 Linux 客户端应用程序设置选项 SO_REUSEADDR,每次都将套接字绑定(bind)到端口 8888,并连接到目标端口 6666。我的问题是,为什么 bind() 成功,为什么connect() 失败了吗?我原以为 SO_REUSEADDR 可以接管本地 TIME_WAIT 端口,它确实这样做了,但是 connect() 有什么反对再次与目标 ip:6666 交谈?
我的代码是在做一些不应该做的事情还是这是预期的行为?
我可以确认失败的 connect() 根本没有 SYN 数据包从客户端计算机发出。我附上了上述 session 的 FIN 握手截图。
最佳答案
您之前的实现使用了 RST
结束连接。收据 RST
数据包立即从事件连接表中删除连接。那是因为在该连接上没有进一步接收有效数据包的可能性:对等方刚刚告诉您的系统该 session 无效。
如果您使用 FIN
正确终止 session ,另一方面,还有最后一个数据包问题:您如何确定对等方是否确实收到了您发送给他们的 FIN
的最后一个确认。 (这是TCP的TIME_WAIT
状态的定义)?如果对等方没有收到它,他们可能会有效地发送 FIN
的另一个副本。然后您的机器应该重新发送的数据包 ACK
.
现在,您的 bind
成功是因为您使用的是 SO_REUSEADDR
, 但您仍然无法使用两侧完全相同的端口 创建新连接,因为该条目仍在您的事件连接表中(处于 TIME_WAIT
状态)。 4 元组(IP1、端口 1、IP2、端口 2)必须始终是唯一的。
正如@EJP 在评论中建议的那样,客户端指定端口是不常见的,而且通常没有理由这样做。我会改变你的测试。
关于linux - 同时 TCP 终止和后续 connect() : EADDRNOTAVAIL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51417495/
应用程序在本地主机上工作正常。但是当它连接到服务器时出现错误。 我通过端口 22 连接服务器 这是错误 Error: listen EADDRNOTAVAIL Error: listen EADDRN
我真的遇到了这个问题。我在 Windows 机器上(具有管理员权限),我想开始使用 vagrant 设置我的工作环境。 问题是我遇到了错误(如下)并且我找不到任何解决方案......我正在使用最新的虚
我有一个简单的 Node.js 应用程序,无法连接到 SQL 数据库。 Web 服务器是 Azure Web App,运行 node.js 并使用 Tedious对于 SQL。DB 是 Azure S
突然间(上周工作正常)我在尝试使用 Nodemailer 发送电子邮件时开始收到发送邮件时出错:错误:连接 EADDRNOTAVAIL . 该错误确实很模糊,我不太确定 EADDRNOTAVAIL 的
我正在尝试使用以下脚本使用 node.js 下载文件: var http = require('http'); var fs = require('fs'); var file = fs.create
我刚开始使用 NodeJS 开发 Web 应用程序,我的应用程序有一个问题我不知道如何解决。 应用程序(我们使用 expressjs)在我的本地机器上运行平稳,但是当我们将它部署到我们的开发服务器进行
我在 172.16.1.218 上运行了以下 node.js 服务器: var net=require('net'); var server = net.createServer(function (
我在我的应用程序中出现了似乎无法重现的故障。我有一个失败的 TCP 套接字连接,应用程序试图重新连接它。在尝试重新连接的第二次 connect() 调用中,我得到一个错误结果,错误结果为 errno
我正在尝试通过 Appstore 的 IPv6 支持,但遇到了一些问题。 我关注了苹果公会Supporting IPv6 DNS64/NAT64 Networks ,我的代码: const char
(已在 Centos 6.5 和 Centos 7 上测试过) 如果您在 linux 中使用 INADDR_ANY 和 0 端口在 connect() 之前调用 bind() 那么 bind() 的临
我的公司发布了一个用于特殊用途的特殊 TCP 堆栈,我的任务是实现符合 RFC793 的关闭序列。其中一个单元测试有一个服务器在特殊的 TCP 堆栈之上工作,与一个普通的 Linux TCP 客户端通
我的 Node 应用程序正在监听端口 8080。当我添加时 app.listen(port,'50.30.217.289'); 我可以从浏览器访问该应用程序。但是,当我将 IP 地址替换为 EC2 实
我已经在 OpenShift 上开发了一个 nodejs 服务器,现在我正尝试在 Heroku 上为一个新项目制作相同类型的服务器。 这是我的服务器的最小代码: var http = require(
我最近在更新Laravel环境或Windows 10的一部分时遇到了一些错误,所以在经过大量的尝试和错误之后,我决定删除所有内容并从头开始。所以现在我有了新的 VirtualBox、Vagrant、L
我在我的笔记本电脑上安装了相当全新的 OpenSUSE,并尝试测试一个全新的 React 应用程序。 我从 create-react-app 站点运行了以下命令: npx create-rea
我用 node.js 编写了以下代码来访问 Twitter Streaming API。如果我 curl 下面的 URL,它就会起作用。但是,我无法让它与我的代码一起工作。 var https = r
我在 centos 6.3 服务器上使用 rail for teambox,实际上这只是在实际应用之前的试错。 我正在使用 2 个运行在相同 centos 版本和精确副本上的虚拟机,VM2 只运行远离
我在我的服务器中安装了 Nginx 和 Node.js。 当我尝试运行我的 node.js 文件时,我收到一个错误: node.js:201 throw e; // process.ne
我正在运行一个应该托管在本地服务器上的 Node 应用程序。 目前,我只发送一个明文响应。 const http = require('http'); var server = http.create
我正在尝试让一个nodejs应用程序在Azure上运行(它在Heroku上运行得很好)。 在应用程序上运行 npm start 后,出现以下错误: Error: connect EADDRNOTAVA
我是一名优秀的程序员,十分优秀!