커널 기반 Linux 버전 2.6.12.3-a9-17을 사용하는 uclinux를 실행하는 arm-cpu 기반 보드를 사용하여 UDP 프로토콜을 사용하여 양쪽 네트워크로 PC에서 데이터를 수신합니다. .Linux : UDP 수신 메시지가 전송되는 속도보다 느림
내 문제는 보드에서 모든 메시지를받을 수 있지만 (손실되지는 않음) 수신 메시지 간의 시간 간격은 최대 20ms로 제한됩니다. 즉, 30ms마다 메시지를 보내면 모든 것이 정상입니다. 그러나 매 10ms마다 메시지를 보내면 보드에 20 밀리 초마다 수신되는 UDP 패키지가 표시됩니다 (따라서 모든 메시지를 수신하는 데 PC가 사용하는 시간의 두 배가 걸립니다).
나는이 수신 메시지 사이의 시간 간격을 측정하려면 다음 코드를 사용하고 있습니다 : PC에
: 보드에
UDP output: 10.019000ms, string: 353:ABCDEFG
UDP output: 10.067000ms, string: 354:ABCDEFG
UDP output: 10.068000ms, string: 355:ABCDEFG
UDP output: 10.068000ms, string: 356:ABCDEFG
UDP output: 10.004000ms, string: 357:ABCDEFG
UDP output: 10.120000ms, string: 358:ABCDEFG
:
여기struct timeval tnew, told, dt;
gettimeofday(&tnew,0);
told = tnew;
while (1) {
memset(buf, 100, 0);
int recvlen = recvfrom(fd, buf, 100 , 0,
(struct sockaddr *)&addr_recv, &addr_len);
if (recvlen>0) {
gettimeofday(&tnew ,0);
timersub(&tnew,&told,&dt);
told = tnew;
printf("UDP intput: %fms, string:%s\n", (float)dt.tv_usec/1000.0,buf);
}
것은 결과입니다
UDP intput: 20.000000ms, string: 353:ABCDEFG,
UDP intput: 20.002000ms, string: 354:ABCDEFG,
UDP intput: 19.998000ms, string: 355:ABCDEFG,
UDP intput: 20.051000ms, string: 356:ABCDEFG,
UDP intput: 19.953000ms, string: 357:ABCDEFG,
UDP intput: 19.996000ms, string: 358:ABCDEFG,
이 간격은 리눅스 시스템에서 뭔가 정의되어야한다고 생각합니다. 어떻게 해결할 수 있습니까?
, BTW 보드 쇼 (EXT = eth0를)의 iptables에 :
iptables -A INPUT -i $EXT -p udp -d 0/0 --dport 1024:65535 -j ACCEPT
대단히 감사합니다.
[TCP] (http://en.wikipedia.org/wiki/Transmission_Control_Protocol)에서 [sliding windows] (http://en.wikipedia.org/wiki/)와 동일한 문제를 어떻게 처리하는지 읽을 수 있습니다. Sliding_window_protocol). –
그냥 추측하십시오. 수신 프로세스 우선 순위를 높이려고 시도 했습니까? RT 우선 순위를 시도하십시오. – Marian
보드가 printf 문자열을 출력하는 데 얼마나 걸리나요? 빠른 비디오 컨트롤러 또는 느린 직렬 링크가 있습니까? –