TCP 연결에 이름 지정된 파이프 사용 / 사용


15

나는 이것을 잠시 동안 작동시키는 데 어려움을 겪고 있었기 때문에 파이프가 어떻게 작동하는지에 대한 근본적인 오해가 내 문제의 근본 원인이라고 생각합니다.

내 목표는 netcat파일 시스템에 원격 호스트에 대한 TCP 연결을 시작하고 들어오는 데이터를 얻기 위해 프로세스에서 읽을 수있는 파이프와 나가는 데이터로 사용되는 프로세스에 쓸 수있는 두 개의 명명 된 파이프를 갖는 것입니다. 현재 다음 구성을 사용하고 있습니다.

mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &

여기에서 다른 프로세스가이 열린 TCP 연결을 읽고 쓸 수 있도록하려고합니다. 이것이 "정상 작동"해야합니까, 아니면 이와 같은 구성이 작동하지 않는 이유가 있습니까?

무엇 보인다 현재 발생하는 것은 내가 읽을 수 있다는 것입니다 out문제없이,하지만 난에 쓸 때 in나는 출력 죽은 깨진 파이프와 이후의 모든 통신이 나타납니다 언급을 얻을. 생각?

(관련 : 나는 원래 사용 :

netcat foo.bar.org 4000 < out > in &

그러나 입력 대기를 차단하는 것으로 나타났습니다. 이것에 대해서도 궁금하지만 별도의 질문으로 해결하는 것이 좋습니다.)

답변:


6
cat out | netcat foo.bar.org 4000 > in &

문제는 파이프 에서 cat수신하자마자 종료 되는 것 입니다. 그리고 때 종료 (를 포함하여 파이프 라인의 나머지 )뿐만 아니라 종료됩니다.EOFoutcatnetcat

대신 다음과 같이 해보십시오.

while true; do cat out; done | netcat foo.bar.org 4000 > in &

따라서 cat필요한만큼 자주 다시 시작되고 파이프에 EOF나타나는 모든 항목 out이 효과적으로 처리됩니다.


나는 이것을 시도했지만 파이프에 write(stdout): Broken pipe쓴 후에 (또는 곧) 쓴다 out.
noffle

2

나는이 문제에 직면했다. 주요 문제는 netcat입니다. 훌륭한 도구이지만 연결된 입력 또는 출력 파일 디스크립터 중 하나가 닫히면 연결이 닫힙니다. 서버가 청취하지 않을 때는 아무 것도하지 않고 다른 피어가 닫히면 종료됩니다. 서버를 올바르게 설정하고 파일 디스크립터를 열어두면 작동합니다. 예를 들어 다음 시나리오를 테스트했으며 매우 잘 작동했습니다. 터미널 설정에서 에코 서버 (아래와 같이 설정) :

mkfifo loopFF
netcat -t -l -p 4000 <loopFF | tee loopFF

이제 다른 터미널 설정에서 서버에 대한 fifo 연결 :

mkfifo in
mkfifo out
netcat 127.0.0.1 4000 <out >in &

서버가 사용자에게 보내는 모든 것을 인쇄하십시오 ( in종료시 한쪽 끝을 netcat닫고 연결 을 닫는 응용 프로그램에서 fifo 를 사용하는 경우 계속 실행 하십시오)

cat in &

그리고 같은 터미널에서 :

cat > out

이제 입력 한 모든 내용이 다시 인쇄됩니다 (Enter 키를 누른 후). 이 명령을 닫으면 연결도 닫힙니다.


나는 그것을 직접 시도 할 때 그렇지 않은 것을 알 수 있지만 왜 netcat -t -l -p 4000 < loopFF | tee loopFF자체적으로 무한 피드백 루프를 일으키지 않습니까?
noffle

내가 말했듯 netcat이 네트워크 연결 중 하나가 닫힐 때마다 @noffle이 닫힙니다. 문자열을 보내고 동일한 문자열을받는 클라이언트를 닫으면 netcat서버도 닫힙니다. 이 경우 여러 클라이언트를 처리하고 클라이언트를 다시 연결하기 위해 자체적으로 서버 코드를 작성했습니다.
saeedn

2

Steven Monday의 분석은 나에게 좋아 보인다 : fifo가이므로 cat첫 번째 쓰기 후 반환합니다 . 이를 피하기 위해 해결책은 fifo가 쓰기 모드에서 열린 상태로 프로세스를 유지하는 것입니다 .outemptycat

mkfifo in
mkfifo out
cat > out &
echo $! > out-pid
cat out | netcat foo.bar.org 4000 > in &

(out-pid 파일은 모든 것을 멈추는 방법 kill -9 $(cat out-pid)입니다.)

여기에 또 다른 예가 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.