UDP 프로토콜

UDP 프로토콜

을(를) 통해 메시지를 보내려고 합니다 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관련이 없습니다.) 이와 같은 내용은 실제 상황에서 유용할 수 있으므로 netcat90초 후에 종료됩니다.

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가 여전히 실행 중인 경우에도 적용됩니다. 이는 이식성 문제로 인해 종료가 불가능한 환경에서 발생할 수 있습니다.

관련 정보