UDP 모드에서 더 많은 데이터를 기다리는 nc (netcat)가 정지합니다.


16

읽기 블록 내에서 nc를 통해 statsd에 작은 문자열을 보내려고합니다.

while read line; do
    printf "folder.counter:value|1c" | nc -q 0 -u $host $port
done

불행히도 UDP 모드에서는 nc가 지정한 경우에도 nc가 무기한 대기하고 싶어하는 것 같습니다 -q 0. 맨 페이지에 EOF 직후에 프로그램이 종료됩니다.

전달하려고했지만 -w 1전송하는 데이터가 초당 두 줄 이상으로 들어 오면 데이터가 버퍼링되고 실시간 통계가 손실됩니다 (버퍼 오버플로 위험을 언급하지 않음).

netcat을 사용하여 수행하려는 작업을 수행 할 수 있습니까, 아니면 통계 라이브러리가있는 언어로 무언가를 작성해야합니까?


비록 당신을 해결하지 못했지만 -q 0을 추가하면 내 문제가 해결되었습니다
Colin

이것은 지금 TCP 모드에서 발생합니다.
baitisj

답변:


9

나는 다음으로 전환하여 문제를 해결했다 socat.

while read line; do
    printf "folder.counter:value|1c" | socat -t 0 - UDP:$host:$port
done

다른 입력이 없었으므로 문제가 해결되었으므로 답변으로 표시하고 있습니다.
bshacklett

netcat에 1 초 제한 시간을 추가 할 수 있습니다 (-w 1 인수를 추가하면 작동했을 것임).
parkamark

7

-w에 시간 종료 값으로 0을 지정할 수 있으므로 전혀 기다리지 않습니다.


이것이 정답입니다.
Petrus K.

3
제로 타임 아웃은 용납 할 수 없습니다. 오류 :invalid wait-time 0
AstraSerg

2

-v 옵션을 추가하면 문제가 해결되었습니다. 내가 확실하지 않은 이유.


2

나는 같은 문제가 있었다; -c옵션을 사용하여 해결했습니다 .

-c, --close                close connection on EOF from stdin

그래서 같은

while read line; do
    printf "folder.counter:value|1c" | nc -cu $host $port
done

예, 실제로 udp 연결을 "닫는"것은 의미가 없지만 결과적으로 작동합니다.


추가 -c하면 내 문제가 해결되었습니다netcat (The GNU Netcat) 0.7.1
Noah Sussman

0

우리에게는 파이썬 스크립트를 통해 한 머신에서 다른 머신으로 nc 페이로드를 보내고있었습니다. 파이썬에서는 'UTF-8'로 페이로드를 명시 적으로 인코딩했을 때 작동했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.