netcat을 "스트림"으로 만들기

netcat을 "스트림"으로 만들기

그래서 저는 netcat음성 통화를 설정할 수 있는 간단한 실험을 하고 있습니다. 이것이 내가 사용하는 명령입니다.

섬기는 사람: arecord | netcat -l 10000 | aplay

고객: arecord | netcat localhost 10000 | aplay

내 문제는 클라이언트가 연결되기 몇 초 전에 서버가 시작될 때 서버에서 음성이 지연된다는 것입니다. 이 지연을 제거하는 방법을 알고 싶습니다. 에서 몇 가지 값을 설정하면 될 것 netcat같은데 어떤 값을 설정해야 할지 잘 모르겠습니다.

저는 UDP와 TCP를 사용했습니다. 둘 사이에는 차이가 없습니다.

답변1

귀하의 쉘이 출력을 더 이상 전달하기 arecord전에(즉, 클라이언트가 연결될 때) 출력을 버퍼링하고 있는 것 같습니다 . netcat확인하려면 다음을 시도해 보세요.

arecord | pv | netcat -l 10000 | aplay

내 우분투 에서는 pv.​​arecordnetcatpvpv -B

stdbuf나는 and unbuffer(후자는 expect-dev내 우분투 패키지에 있음)를 사용해 보았 으나 결과가 만족스럽지 않았습니다.

dd다음을 사용하여 충분한 데이터를 새로 고쳤을 때 상당한 진전이 있었습니다.클라이언트에서:

arecord | netcat localhost 10000 | { dd bs=100K count=1 iflag=fullblock of=/dev/null; aplay; }

나에게는 충분합니다 100K. 귀하의 마일리지는 다를 수 있습니다. 명령을 너무 빨리 실행하는 경우 dd(서버 측 버퍼가 가득 차기 전) 또는 매개변수가 bs=…너무 큰 경우 명령이 완료될 때까지 몇 초 정도 기다려야 합니다.

답변2

TCP를 사용하면 데이터가 손실되지 않도록 연결이 "보장"됩니다. 귀하의 경우 클라이언트와 서버가 데이터 손실을 피할 수 있는 유일한 방법은 배달을 위해 대기열에 넣는 것이기 때문에 이 작업을 원하지 않을 것입니다.

두 시스템 모두 UDP를 사용하도록 전환할 수 있습니다. 이는 연결이 없기 때문에 첫 번째 패킷을 대기열에 넣지 않지만 삭제됩니다. 지금은 테스트할 수 없지만 다음을 시도해 보시기 바랍니다.

시스템 1의 서버

arecord | nc -u -l -p 10000 | aplay

시스템 2의 클라이언트

arecord | nc -u system1 10000 | aplay

관련 정보