如何使用 node.js 发送“FIN”?

Posted

技术标签:

【中文标题】如何使用 node.js 发送“FIN”?【英文标题】:How to send the 'FIN' with node.js? 【发布时间】:2014-03-24 02:38:26 【问题描述】:

更新:我在这里发布了这段代码,在我一一添加了所有(99%)的可能性之后,它仍然给了我 120 秒的超时......缓冲。


所以,好吧,我认为在我的 Windows 7 机器上需要 120 秒(好吧,122 秒),直到FIN 握手开始。我想马上去做。 HTTP RFC793 说

FIN:没有更多来自发件人的数据

在我看来,我不再发送任何数据。我尝试了所有这些臃肿的代码,仍然是Hello World 服务器...

var http = require('http')
var server = http.createServer(function (req, res) 
    res.writeHead(200, 'Content-Type': 'text/plain')
    res.write('HELLO WORLD!\n')
    res.end()
    res.setTimeout(0)
    req.abort()     // 1) TypeError: Object #<IncomingMessage> has no method 'abort'

    req.on('socket', function (socket) 
        socket.setTimeout(0)  
        socket.on('timeout', function() 
            req.abort()
        )
    )
)
server.timeout = 0
server.setTimeout(0)
server.listen(1337, '192.168.0.101')
    那么 1) 怎么办? (其实是这样发RST的……)

    以及如何做到整件事HTTP符合? 当然最后我会很幸运地使用nodejswebsocket 一样的东西和所有这些,但是如果我的网站上的转换意味着两分钟的事情,并且我有一百万并发用户(嗯?),发送FIN 立即可能意味着我有 200 万并发用户(算一下)。 ;) 好的,确定一点:发送FIN 表示套接字已关闭?

    啊,嗯,好吧,既然你在,我怎么console.log(res)console.log(req)?它给了我[object Object]。 (更新:我试过console.log(res.toSource()),给我TypeError编辑:找到答案here。

【问题讨论】:

【参考方案1】:

如果要关闭连接,请发送connection: close 标头。如果你这样做,那么它不会让连接保持打开状态以供重复使用。

【讨论】:

谢谢先生!所以当我查看我的试验时,默认时间 120 秒是不可更改的? setTimeout(0) 完全消除超时。 setTimeout(1) 将使其为 1 毫秒。 嗯,我仍然有 2 分钟的超时时间,0s。 :/周末没有再尝试了,陷入视差滚动哈哈。你到底是指哪个setTimeout 请记住,这可能不是您想要的。如果这是实时处理来自同一主机的多个连接,则保持活动将有助于提高性能,因为 http 请求不需要建立新的套接字。 嘿@jeremy。现在才看到你的评论。是的,我想为完成某些连接的任务做好准备(比如门卫;)。最后我发现:res.end() 独自完成这项工作(并发送标题)。

以上是关于如何使用 node.js 发送“FIN”?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HTML 输入文件导入 excel 文件并在 Node.js 中读取文件内容(如何将完整路径发送到 Node.js)

如何使用 node.js 发送 HTTP/2.0 请求

如何使用 Node.js 通过代理发送 HTTP/2 请求?

如何使用 Node.js 将 JSON 数据从 Node.js 发送和获取到 HTML

如何使用 Fetch 在前端显示通过 HTTP (Node.js) 发送的图像?

Google Cloud Vision - 如何使用 Node.js 发送请求属性