을(를) 통해 메시지를 보내려고 합니다 netcat
. 메시지를 보낸 후에 netcat
는 종료해야 합니다.
나는 다음을 시도했습니다 :
cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin
이 -q
옵션에는 다음이 명시되어 있습니다.
-q 초
stdin에서 EOF 후 지정된 시간(초)을 기다린 후 종료합니다. 초가 음수이면 영원히 기다리십시오.
하지만
nc -q0 -u localhost 4300 < message.bin
작동하지 않습니다.
내가 무엇을 놓치고 있나요?
답변1
EOF를 보낸 후 연결이 유휴 상태로 유지된다고 가정하면 0과 동일한 -w timeout
옵션을 사용할 수 있습니다 timeout
(어리석은 -q
옵션과 달리...).
cat tsmmessage.bin | nc -u localhost 4300 -w0
답변2
이 -q
플래그가 없으면 인스턴스는 netcat
영원히 기다리게 됩니다. UDP에는 "스트림 끝" 메시지가 없으므로 이를 netcat
알 방법이 없습니다.표준 입력그리고 네트워크 연결이 완료되었습니다.
예를 들어 TCP/IP를 사용하면 예상대로 작동합니다.
nc -l localhost 4300 # Window 1
nc localhost 4300 </etc/group # Window 2
그러나 당신이 결정한 대로 UDP/IP에서는 이것이 끝나지 않습니다.
nc -u -l localhost 4300 # Window 1
nc -u localhost 4300 </etc/group # Window 2
이것이 -q
로고가 작용하는 곳입니다. 그러나 불행하게도 값을 허용하지 않습니다 0
. 또한 정수가 아닌 값도 허용되지 않습니다. 이는 timeout
다른 외부 유틸리티 에 의존하지 않고 제가 제공할 수 있는 최선의 대안입니다 .
nc -u -l localhost 4300 # Window 1
nc -q 1 -u localhost 4300 </etc/group # Window 2
여기서도 netcat
감상 시간을 우아하게 마무리할 수는 없습니다. ( -w
시간 초과 옵션은 무시되며 -q
관련이 없습니다.) 이와 같은 내용은 실제 상황에서 유용할 수 있으므로 netcat
90초 후에 종료됩니다.
timeout 90 nc -u -l localhost 4300 # Window 1
nc -q 1 -u localhost 4300 </etc/group # Window 2
답변3
UDP 프로토콜
# listen on receiver
nc -u -l localhost -p 4300
# sender
cat tsmmessage.bin | nc -u -N -q 0 localhost 4300
TCP 프로토콜
# listen on receiver
nc -l localhost -p 4300
# sender
cat tsmmessage.bin | nc -N localhost 4300
편집: 이 솔루션은
openbsd-netcat
설명에 따라 작동하며GNU Netcat
다음에서는 작동 하지 않습니다.Archlinux
답변4
상당히 이식 가능한 옵션은 SIGHUP을 클라이언트 인스턴스로 보내는 것입니다 nc
. 예:
kill -1 <pid of nc>
또는
pkill -1 nc
이는 데이터 흐름이 완료되어 연결을 완전히 닫아야 하지만 nc가 여전히 실행 중인 경우에도 적용됩니다. 이는 이식성 문제로 인해 종료가 불가능한 환경에서 발생할 수 있습니다.