직장(BSD nc 버전)과 많은 인터넷 예제에서 ncat은 udp를 수신하고 다음 옵션과 함께 사용할 수 있습니다:
-k
다중 연결 허용-w 0
클라이언트 연결이 끊어지면 현재 연결을 종료합니다.
집에 다음과 같은 것들이 있어요
명령: Ncat: 버전 7.60(https://nmap.org/ncat)
운영 체제: 페도라 27
-k
또는 을 사용할 수 없습니다 -w 0
.
ncat -klu localhost 8000
Ncat: UDP mode does not support the -k or --keep-open options, except with --exec or --sh-exec. QUITTING.
nc -luw 0 localhost 8000
Ncat: Invalid -w timeout (must be greater than 0). QUITTING.
내 ncat 버전에서 즉시 활성 상태를 유지하고 시간 초과를 유지하려면 어떻게 해야 합니까? (맨 페이지는 도움이 되지 않습니다)
감사해요
답변1
첫째, nc, ncat 및 netcat은 모두 서로 동일한 이름을 가진 기술적으로 다른 도구이지만, 따라서 반드시 동일한(상호 운용 가능한) 기능/옵션을 제공하지는 않습니다.
둘째, 어떤 버전으로 작업하고 있는지 확실하지 않지만 현재 버전의 ncat에서는 옵션 k가 udp에서 작동하지 않습니다. TCP에서만 작동합니다. 그러나 udp는 상태 비저장(연결 프로세스 없음)이기 때문에 소스 연결이 끊어지더라도 ncat은 udp에서도 계속 수신 대기합니다. 그러나 소스가 처음 사용된 것과 동일한 소스 포트에서 다시 연결/재전송하지 않는 한 더 이상 패킷을 수신하지 않습니다(최근 버전의 ncat은 udp에서 볼 수 있는 첫 번째 소스 포트에 잠겨 있기 때문입니다. 그런 다음 모든 것을 무시합니다) 불행히도 이 동작은 소스 코드를 수정하지 않는 한 구성할 수 없습니다. 따라서 유일한 "해결 방법"은 다른 도구를 찾거나 제가 직접 사용하고 코딩하는 Python으로 직접 작성하는 것입니다.
#! /usr/bin/python
from socket import socket,AF_INET,SOCK_DGRAM,SO_REUSEADDR,SOL_SOCKET
from time import sleep,ctime
import sys
if len(sys.argv)>2:
localIP = sys.argv[1]
localPort = int(sys.argv[2])
else:
print("Space-separated IP and Port are required")
exit()
print(f"listening on {localIP}:{localPort}")
bufSize = 1500
sock = socket(family=AF_INET, type=SOCK_DGRAM)
sock.setsockopt(SOL_SOCKET,SO_REUSEADDR, 1)
sock.bind((localIP, localPort))
while True:
message, ipport = sock.recvfrom(bufSize)
print(ctime(), f"[{ipport[0]}:{ipport[1]}]",str(message)[2:-1])
가장 간단하지는 않지만 각 패킷의 타임스탬프, IP 및 포트도 인쇄합니다. 확장자가 ".py"인 파일에 넣고 명령으로 직접 입력하여 실행합니다(파이썬이 올바르게 설정되어 있다고 가정). 바인딩하려는 IP와 포트(공백으로 구분)를 전달합니다. IP는 "0.0.0.0" 또는 "127.0.0.1" 또는 "localhost"일 수도 있어 모든 localhost 인터페이스에 바인딩됩니다(따옴표 제외). 타임스탬프나 원격 IP/포트가 필요하지 않은 경우 인쇄 기능의 마지막 줄에서 해당 매개변수를 생략하세요. 예를 들어 메시지만 가져오려면 마지막 줄을 다음으로 바꾸세요.
print(str(message)[2:-1])
답변2
오류 메시지는 수행해야 할 작업에 대한 좋은 아이디어를 제공합니다.
ncat -klu localhost 8000
Ncat: UDP mode does not support the -k or --keep-open options, except with --exec or --sh-exec. QUITTING.
ncat
사용 하시려면 청취 프로그램을 제공하셔야 합니다 . 보낸 사람에게만 입력 내용이 에코되도록 하려면 다음을 수행하세요.
ncat -e /bin/cat -klu localhost 8000
nc -luw 0 localhost 8000
Ncat: Invalid -w timeout (must be greater than 0). QUITTING.
nc
제로 대기 시간은 지원되지 않으므로 다른 것을 사용하세요.
nc -luw 1 localhost 8000
불행하게도 nc는 1초 미만의 대기 시간을 지원하지 않지만 보다 기능이 풍부한 대안을 사용할 수 있습니다 ncat
.
ncat -lu -w 100ms localhost 8000
답변3
기존 답변은 이 문제를 해결하는 방법에 대한 귀중한 정보를 제공합니다. ncat을 사용하여 모든 것을 좋은 해결 방법으로 묶기 위해 다음은 (거의) 즉시 재사용 가능한 UDP 수신기를 만드는 bash 단일 라이너입니다.
while [ /bin/true ]; do ncat -i 1ms -u -l 127.0.0.1 8000 2>/dev/null; done
이러한 매개변수만 사용하여 ncat을 단독으로 실행하면 단일 UDP 패킷이 허용되고, 패킷을 수신한 후 1밀리초 후에 종료되며, 종료 중임을 stderr에 보고합니다. stderr를 /dev/null로 리디렉션하면 시간 초과 메시지가 표시되지 않습니다. 모든 것을 무한 while 루프로 감싸면 UDP 패킷이 수신될 때 (거의) 즉시 다시 들을 수 있습니다.