
저는 OpenBSD netcat이 특정 포트(3333)와 인터페이스(10.42.0.1)에서 UDP 연결을 수신하고 고정된 응답을 보내도록 하려고 합니다. 이를 달성하기 위해 나는 다음을 수행합니다.
echo "asd" | nc -k -u -l -p 3333 -s 10.42.0.1 -v
그런 다음 다음을 수행하여 메시지를 보냅니다.
echo qwe | nc -u 10.42.0.1 3333 -v
출력은 다음과 같습니다
# Server side
Bound on h9ct3d3 3333
XXXXXqwe
# Client side
Connection to 10.42.0.1 3333 port [udp/*] succeeded!
보시다시피 클라이언트는 asd
. 그러나 을 제거하면 -k
수신됩니다.
##### Server side
echo "asd" | nc -u -l -p 3333 -s 10.42.0.1 -v
Bound on h9ct3d3 3333
# ...
# Wait for the client to execute
# ...
Connection received on h9ct3d3 51318
XXXXXqwe
##### Client side
echo qwe | nc -u 10.42.0.1 3333 -v
# ...
# Wait for the above 'X'to finish
# ...
Connection to 10.42.0.1 3333 port [udp/*] succeeded!
asd
를 사용하지 않고 while 루프를 사용하려고 했지만 -k
결코 nc
반환되지 않습니다.
#!/bin/bash
while true
do
echo "Host message" | nc -q 0 -u -l -p 3333 -s 10.42.0.1 -v
echo "restarting..."
done
이 작업을 어떻게 수행할 수 있나요?
내 netcat 버전은 다음과 같습니다.
OpenBSD netcat (Debian patchlevel 1.206-1ubuntu1)
PD. 서버 는 왜 nc
이상한 X
문자를 '보내는' 걸까요? 클라이언트는 결코 읽지 않고 단지 완료될 때까지 기다립니다. 1초마다 표시되는 것 같습니다.
답변1
서버가 X를 보내지 않습니다. 클라이언트는 처음 두 개 이후 1초 간격으로 이를 보내고 서버는디스플레이(그렇게 해야 합니다). 벗으면-v
고객, X는 전송되거나 표시되지 않으며 데이터는 즉시 전송되어 표시됩니다(3초 이후가 아님). 나는 단서가 없다왜 -v
'천천히 5개의 문자를 보내세요'를 의미합니다!
맨 페이지는 다음과 같이 -k
말합니다.
-u 옵션과 함께 사용하면 서버 소켓이 연결되지 않으며 여러 호스트로부터 UDP 데이터그램을 수신할 수 있습니다.
이에 따라 서버는 를 사용할 때는 -v
로그를 기록 하지만 . 나Connection from {host} {port} received!
-ul
-ulk
의심하다'응답' 데이터를 보내는 코드는 연결된 소켓에 의존하므로 연결되지 않은 상태로 두면 응답이 방지되지만 확인하기 위해 소스를 파헤치지는 않았습니다.
-q 0
TCP(FIN 교환)에는 있지만 UDP에는 감지 가능한 '연결 종료'가 없기 때문에 작동하지 않습니다. 클라이언트 데이터에 대해 인식할 수 있는 것이 있는 경우(예 : 항상 한 줄인 경우) 논리적으로 해당 데이터를 인식하고 프로세스를 종료하여 루프가 반복되도록 하는 head -1
항목을 작성하는 것이 가능해야 합니다 . 그러한 인식기/킬러가 사용할 수 있는 nc
pid를 얻는 깔끔한 방법을 찾을 수 있었습니다 . nc
다른 사람이 여기서 실제 솔루션을 제공할 수 있는 경우를 대비해 CW를 만듭니다.