gpt4 book ai didi

http - 断开连接后使netcat丢弃所有字节

转载 作者:可可西里 更新时间:2023-11-01 15:11:07 26 4
gpt4 key购买 nike

我使用 netcat 通过 bash 运行一个微型开发网络服务器,它能够一次处理一个连接。

Netcat 启动如下(-k 使其在多个连接中存活):

nc -kl 3000

bash 脚本处理由 netcat 接收的浏览器请求,并构建响应,该响应通过同一 netcat 实例发送回浏览器。

一切都按预期工作,但有时浏览器无法获取它请求的文件。我的怀疑:如果在响应完全发送之前关闭连接,则响应的剩余部分将作为对以下请求的响应发送(当然,它不属于)。

证明

  1. 终端 1(服务器):nc -kl 3000
  2. 终端 2(模拟浏览器):nc 本地主机 3000
  3. 在终端 1 中输入 hello\n
  4. 终端 2 打印 hello\n
  5. 在终端 2 中按 Ctrl+C 结束连接。
  6. 在终端 1 中输入 world\n
  7. 再次在终端 2 中运行 nc localhost 3000(新连接)。
  8. 终端 2 立即显示 world\n,即使 world\n 实际上是在不存在连接时发送的,这意味着第一个连接中的第二个响应行。

要求的行为:如果不存在连接,则忽略传递给 netcat 的所有字节。

是否可以使用 netcat? (我更喜欢像 netcat 这样的工具,因为它预装在所有机器上。)

最佳答案

好吧,作为一种解决方法,如果你能做到这一点,而不是使用 keep-open 选项运行 ncat,只需在 while 循环中的每个连接之间重新生成它:

while true; do
#what you want to do with: ncat -l 3000
done

然后每次进程重新生成时,它都会丢弃所有标准输入,然后您重新开始下一个进程的下一个 i/o。

当然,如果重新生成 bash 脚本不方便,则可能意味着您没有使用正确的工具来完成这项工作。 (您也许可以解决使用 fifos 或使用临时 fds 的问题,但为了避免使用更适合该工作的语言编写脚本,这会过度设计)。


如果您还没有这样做,您是否尝试过从 netcat 运行脚本而不是相反?

ncat -kl 3000 -c ./script.sh

它将为每个连接生成脚本,并在其上重定向标准输入/标准输出。然后当客户端断开连接时,脚本将被终止并且应该释放您的输入 fd。

实际上,如果您将文件作为 http 服务器提供,您可能会查找:

ncat -lk 3000 --lua-exec httpd.lua

httpd.lua offered with the ncat distribution


如果你想要一个简单的 run anywhere 脚本来在你的系统上做一些事情,你可以写一个小的 python 脚本。

它默认安装在 ubuntu(和许多其他系统)上,并且您提供了一个极简主义的网络服务器实现,例如用于提供您刚刚执行的文件:

python -m SimpleHTTPServer <port>

而是easy to customize ,以满足您的独特需求,并将为您提供对套接字和文件描述符的完全控制。

关于http - 断开连接后使netcat丢弃所有字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43559393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com