開始するには、小さなサーバーを作成し、うまくいったnetcat
。
#!/bin/bash
PORT="1234";
startServer(){
fifo="fifo/$1";
mkfifo "$fifo";
connected="0";
netcat -q 0 -l -p "$PORT" < "$fifo" | while read -r line; do
if [ "$connected" == "0" ];then
#listen for a new connection
startServer $(($1+1))&
connected="1";
fi
#server logic goes here
done > "$fifo";
rm "$fifo";
}
mkdir fifo;
startServer 0;
fifosを使用してメインループ出力を再びnetcat
。
呼び出すたびにstartServer
値が増加し、$1
fifoファイルが生成されますfifo/$1
。
しかし、私は使いたいBash は自動的にファイル記述子を生成します。ファイルfifo
とstartServer
。
多くの試みの終わりに、これは現在のstartServer
機能を修正しようとする試みです。お客様から回線を受けることができますが、残念ながら何の回答も受けられません。何が起こっているのか混乱しています。
startServer(){
connected="0";
#create file descriptor and read output from main loop
exec {fd}> >( netcat -q 0 -l -p "$PORT" | while read -r line; do
if [ "$connected" == "0" ];then
#listen for a new connection
startServer&
connected="1";
fi
#server logic goes here
done ) >&$fd;
#close file descriptor
exec {fd}<&-;
exec {fd}>&-;
}
また、netcat-openbsdパッケージでは使用できないため、netcatの "-e"オプションは使用できません。
答え1
fd
実際に実行しているのと同じコマンドで設定して使用することはできませんexec {fd}> ... >&$fd
。どのように機能するかは、まず次のような簡単なコマンドを使用することです:
。
startServer(){
local connected=0 fd
exec {fd}<> <(:)
nc -q 0 -l -p "$PORT" <&$fd |
while read -r line
do if [ "$connected" == "0" ]
then startServer $(($1+1)) &
connected="1"
fi
echo server $1 logic goes here
done >&$fd
exec {fd}<&-
}