stdin이 닫힐 때 netcat이 종료되지 않습니다 -q 초 stdin에서 EOF 후 지정된

를 통해 메시지를 보내려고합니다 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되며 관련이 없습니다.) 이와 같은 것은 실제 상황에서 사용되어 netcat90 초 후에 종료됩니다.

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