断开连接后{net

时间:2017-04-22 12:45:57

标签: http web server netcat

我使用netcat通过bash运行一个小型开发网络服务器,它可以同时处理一个连接。

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

nc -kl 3000

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

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

证明

  1. 终端1(服务器):nc -kl 3000
  2. 终端2(模拟浏览器): nc localhost 3000
  3. 在终端1中输入hello\n
  4. 2号航站楼打印hello\n
  5. 在终端2中按Ctrl + C结束连接。
  6. 在终端1中输入world\n
  7. 再次在终端2中运行nc localhost 3000(新连接)。
  8. 即使在没有连接时实际发送world\n,终端2也会立即显示world\n,这意味着第一个连接中的第二个响应行。
  9. 必需行为:如果不存在连接,则忽略传递给netcat的所有字节。

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

2 个答案:

答案 0 :(得分:3)

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

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

然后每次重新生成进程时,它将丢弃所有stdin,然后重新开始下一个进程的下一个i / o。

当然,如果重新生成bash脚本并不方便,那么这可能意味着您没有使用正确的工具来完成工作。 (你可能能够解决使用fifos或使用临时fds的问题,但是要过度工程以避免用一种更适合这项工作的语言编写脚本。)

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

ncat -kl 3000 -c ./script.sh

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

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

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

使用httpd.lua offered with the ncat distribution

如果你想在一个简单的任何地方运行脚本在你的系统上做某事,你可以编写一个小的python脚本。

它默认安装在ubuntu(和许多其他系统)上,并且您提供了一个简约的Web服务器实现,例如,为您提供的文件提供服务:

python -m SimpleHTTPServer <port>

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

答案 1 :(得分:2)

坚持&#34;到处运行&#34;脚本,您可以尝试逐行处理输入并检测netstat是否存在ESTABLISHED连接:

while read line; do 
  netstat -an | grep 3000 | grep -q ESTABLISHED; 
  ret=$?; 
  if [ "$ret" == "0" ]; then 
    echo $line; 
  else 
    # this output is just for fun, and can be removed
    echo "not sending $line" >&2; 
  fi; 
done | nc -kl 3000

这将具有基于行的限制,如果在netstat调用之后立即关闭连接,则仍可能错误地向netcat发送数据。这两个grep调用应该确保你没有错误地检测到你自己的grep。

我已经尝试在连接关闭时查找netcat返回的信号,但是看不到任何暴露给shell的信号。

使用fifo可以用来证明netcat保持stdin打开,即使没有连接:

mkfifo test

nc -kl < test

# then in a different shell
for a in {0..5}; do echo hi > test; done

for没有阻止,因此netcat正在主动读取stdin但缓冲它(我无法看到关闭缓冲的选项)。这意味着除了通过查看网络状态之外,您无法真正区分具有或不具有活动连接的netcat。 netstat是获得这种状态的众多方式之一。