를 통해 메시지를 보내려고합니다 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
작동하지 않습니다.
내가 무엇을 놓치고 있습니까?
답변
EOF 연결을 보낸 후에 유휴 상태로 있다고 가정하면 -w timeout
옵션 을 사용할 수 있습니다.이 옵션 timeout
은 0과 같습니다 (멍청한 -q
옵션 과 달리 …)
cat tsmmessage.bin | nc -u localhost 4300 -w0
답변
-q
깃발이 없으면 당신의 인스턴스는 netcat
영원히 기다릴 것입니다. UDP에는 “스트림 끝”메시지가 없으므로 stdin 과 네트워크 연결이 모두 완료 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
답변
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
답변
인터넷 검색에서 거의 같은 문제에 대해이 문제가 발생했습니다. 문제가 발생했을 때 netcat이 모든 데이터가 흡입 된 직후 bash에 의해 살해되었다는 것이 밝혀졌습니다.
이것에 대한 나의 해결책은 다음과 같이 데이터를 파이핑 한 후 약간의 지연을 추가하는 것이 었습니다.
(echo INFO; sleep 1) | nc redis.service.consul 6379
파일을 사용하면 다음과 같이 보일 수 있습니다.
(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300