시작하려면 작은 서버를 만들었고 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}<&-
}