2016-07-15 6 views
0

대기 시간에 상당히 까다로운 Linux 기반 무선 네트워크 응용 프로그램이 있습니다. 즉, 데이터 패킷의 늦은 도착은 데이터가없는 것과 비교하여 전혀 좋지 않다. 또한 소켓의 이전 데이터는 최신 데이터 만 지연시킬 수 있습니다.대기 시간을 줄이기 위해 tx udp 소켓 커널 버퍼를 플러시

송신 측에서 소켓이 이전 데이터로 쌓여 있고 그런 경우에는 플러시/삭제하고 새로운 데이터를 보내는 것을 감지 할 수있는 방법이 있는지 찾고 있습니다.

나는 수신기가 모든 이전 데이터를 읽고 폐기 할 수 있음을 알고 있습니다. 그러나 이것은 여전히 ​​따라 잡을 수 있으며, 속도를 높이는 데 도움이되지 않을뿐만 아니라 발신자 측 옵션으로 평가할 수 있습니다.

도움 주셔서 감사합니다.

+0

커널은 이미 송신 버퍼에서 가능한 한 빨리 데이터를 전송하며 네트워크는 필요한 경우 이미 데이터를 삭제합니다. – EJP

+0

@EJP, 감사합니다! 예, 버퍼를 즉시 보내려는 시도가 있습니다. 연결이 끊어진 상태에서 다시 연결되는 동안 시나리오에서 커널은 이전 데이터를 먼저 보내고 응용 프로그램 공간에서 패킷을 누락/누적 한 다음 새 데이터로 시작합니다. 이전 데이터를 완전히 플러시하여 새 데이터로 이동할 수있는 방법이 있기를 바랬습니다. – Ananth

+0

현재 우리는 debugx를 사용하여 tx 대기열을 읽고 설정된 상한 임계 값을 기반으로 대기열에 더 많은 데이터를 추가하지 않으며 tx 대기열이 새 데이터를 넣기 전에 tx 대기열이 낮은 워터 마크에 도달 할 때까지 대기하여 이전 데이터를 스트림에 저장합니다. tx 큐가 상위 임계 값에 도달하여 즉시 큐의 맨 아래에 도달하면 tx 큐를 삭제하는 방법을 찾아야합니다. – Ananth

답변

-1

발신 측에서 Nagle 알고리즘을 해제하십시오. 이 알고리즘은 오버 헤드를 줄이기 위해 작은 패킷을 큰 패킷으로 수집하려고하므로 각 패킷을 즉시 전송할 수 있습니다. 다음은이를 끄는 코드입니다.

void noNagle (int socket) 
{ 
     int on = 1; 
     if (setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) < 0) 
      bye ("Can not disable nagle algorithm\n"); 
} 
+0

Nagle 알고리즘은 UDP가 아닌 TCP의 일부입니다. – EJP

+0

아주 정확한 ... 미안 해요. – pidloop

관련 문제