과거에 일부 멀티캐스트 연결을 테스트할 때 나는 socat을 사용하여 다음과 같이 했습니다.
socat -u UDP4-RECVFROM:12345,add-membership=224.1.2.3:eth0,fork,reuseaddr,readbytes=32 SYSTEM:"hexdump -C"
그런 다음 일부 패킷이 보이거나 1~2초 후에 아무것도 보이지 않으면 Ctrl-C를 누르십시오.
이제 수백 개의 멀티캐스트 주소로 이 작업을 수행해야 할 때, 특히 그중 일부가 초당 수만 개의 패킷을 보내는 경우(ctrl-c를 누를 수 있는 것보다 5000 더 빠르게 로드) 이는 분명히 자르지 않은 실제가 됩니다.
socat이 하나의 패킷만 수신하고 종료하도록 제한하는 방법은 무엇입니까? 또한 아무것도 수신되지 않을 때 시간 초과를 어떻게 설정합니까? (-T 매개변수를 시도했지만 아무것도 작동하지 않는 것 같습니다.)
답변1
socat cmdline 스위치 -T는 UDP4-RECV:에서만 작동하고 UDP4-RECVFROM:에서는 작동하지 않는 것 같습니다. 하지만 UDP4-RECV의 경우 ,fork
작동하지 않으므로 첫 번째 패킷 이후에는 중지해야 합니다.
이로 인해 다음과 같은 가능성이 남습니다.
socat -u udp-recvfrom:8500,add-membership=224.1.2.3:eno1,readbytes=32,fork SYSTEM:"hexdump -C && kill 0" & pid=$!; sleep 10;kill $pid
,fork
각 udp 패킷에 대해 새 프로세스가 시작되면 해당 SYSTEM:"hexdump -C && kill 0"
패킷 후에 socat 프로세스 그룹이 종료됩니다. 원래 명령줄에 그것을 남겨 readbytes=32
두었으므로 패킷의 최대 32바이트를 읽을 수 있습니다.
패킷이 도착하지 않는 경우의 시간 초과 부분은 약간 까다롭고 백그라운드, socat, 절전 모드 및 socat 종료가 필요하기 때문에 좋은 해결책이 없습니다.
패킷이 수신되면 kill $pid는 더 이상 프로세스를 찾지 못하고 오류가 발생합니다. 이 문제는 아직 살아 있는지 확인하여 해결할 수 있습니다.
어쨌든, 이것은 작동할 것입니다.