간단한 예를 들면 다음은 내 서버/호스트입니다.
nc -ul 192.168.0.2 54
고객과:
echo "test" | nc -u 192.168.0.2 54
서버는 "테스트" 메시지를 가로채지만 nc
종료되지는 않습니다. Enter 또는 Ctrl+c를 누를 때까지 열려 있습니다. 자동으로 종료되도록 할 수 있나요? 아니면 클라이언트 메시지에 전송이 끝났음을 나타내는 내용을 포함시킬 수도 있나요?
nc --version
Ncat: Version 7.70 ( https://nmap.org/ncat )
저는 데비안과 macOS를 사용하고 있습니다.
답변1
TCP에는 시작과 끝이 있는 연결 개념이 있지만 UDP에는 그렇지 않습니다. UDP는연결 프로토콜 없음: UDP 수신기는 지정된 UDP 포트에서 들어오는 패킷을 기다리고 도착하는 UDP 패킷의 내용을 인쇄합니다.
수신자는 nc
얼마나 많은 패킷이 들어오는지 또는 해당 패킷이 모두 동일한 호스트에서 와야 하는지 아니면 여러 호스트에서 와야 하는지 전혀 모릅니다. 지정된 UDP 포트에 도착하는 모든 것을 수신하고 보내는 UDP 패킷의 내용을 출력합니다. nc
프로세스가 중단될 때까지 어떤 방식으로든 구문 분석하지 않고 표준 출력을 생성합니다 .
클라이언트/발신자가 보낸 모든 패킷이 수신 측에서 동일한 순서로 수신된다는 기본 보장도 없습니다. 도중에 패킷이 손실되거나 재정렬될 수 있습니다. UDP는 이 문제를 해결하려고 시도하지 않습니다. UDP를 사용하여 목적에 맞게 이러한 모든 문제를 처리하거나 무시하십시오.
"데이터 끝"을 의미하는 특정 문자열을 결정하고 수신 측의 다른 스크립트에서 들어오는 데이터를 구문 분석하고 nc
해당 문자열이 수신되면 수신 프로세스를 종료하도록 할 수 있습니다. 이러한 방식으로 UDP 위에 자신만의(아마도 매우 간단한) 프로토콜을 구축하기 시작합니다.이것이 바로 UDP가 설계된 이유입니다.
nc -ul
간단히 말해서 "자동 종료가 가능합니까 ?" 라는 질문에 대한 대답은 다음과 같습니다. "아니요, 그런 일을 하지 않는 한은 안 됩니다."
답변2
netcat
옵션이 있습니다 -W
:
-W recvlimit Terminate after receiving a number of packets
그래서:
nc -ulW 1 192.168.0.2 54
하지만 ncat
다음 해결 방법을 사용할 수 있습니다.
nc -ul 192.168.0.2 54 -c 'dd count=1 bs=100000 >&3' 3>&1