将标准输入和标准输出连接到套接字

问题描述 投票:0回答:1

想象一个微服务器正在监听某个端口。它接收以 ASCII 换行符终止的请求并发送以 ASCII 换行符终止的响应。简单的。简单。

现在想象一个简单的脚本,在标准输出上打印请求并监听标准输入上的响应:

#!/bin/bash
while true; do
  echo "A request"  # send a request to the microserver via stdout
  read              # block until a response is received from microserver via stdin
  echo "Server response is" $REPL:Y

[当然这个脚本可以用 C 或 Python 或 SNOBOL 或其他语言编写,但重点是它在 stdout 上打印一些内容并等待 stdin 上的回复。]

鉴于此,我如何将此脚本的标准输出和标准输入连接到微服务器正在侦听的套接字/端口号?假设我正在类似 Linux 的系统上运行。我看到暗示

mkfifo
nc
可能是答案的一部分,但我无法将这些点联系起来。

sockets stdio
1个回答
0
投票

要将脚本的标准输出和标准输入连接到微服务器正在侦听的套接字/端口,您可以使用 nc (netcat) 和命名管道 (FIFO) 的组合。具体方法如下:

  1. 为输入(发送请求)和输出(接收响应)创建命名管道(FIFO)。您可以使用 mkfifo 来实现此目的。

mkfifo request_fifo
mkfifo response_fifo

  1. 修改脚本以从请求 FIFO 读取并写入响应 FIFO:

#!/bin/bash
while true; do
  echo "A request" > request_fifo  # send a request to the microserver via the request FIFO
  read < response_fifo             # block until a response is received from microserver via the response FIFO
  echo "Server response is" $REPLY
done

使用 nc 将微服务器的套接字连接到请求和响应 FIFO。在后台运行 nc 来处理脚本和微服务器之间的通信。

nc -l -p <port> < <(cat response_fifo) | while read line; do
  echo "$line" > request_fifo
done > response_fifo &

替换为您的微服务器正在侦听的实际端口号。

现在,当您运行脚本时,它将通过请求 FIFO 向微服务器发送请求,并通过响应 FIFO 接收响应。 nc 命令充当脚本和微服务器之间的桥梁,在命名管道和套接字之间转发数据。

确保替换为您的微服务器使用的实际端口号,并确保脚本和 nc 命令在后台运行,适合您的用例。

© www.soinside.com 2019 - 2024. All rights reserved.