문제

이 있다고 가정하는 프로그램에서 읽을 소켓에.어떻게 당신을 유지 다운로드 속도가 일정하여 지정된 임계값?

도움이 되었습니까?

해결책

응용 프로그램에서 레이어를 사용하여(버클리타 소켓 API)당신은 시계와 데이터를 읽거나 쓸에서 속도를 제한하고 싶습니다.

는 경우에만 읽 10kbps 평균지만,소스를 보내는 것보다 더 많은 것,그리고 결국 모든 버퍼 사이에 그것을 채울 것입니다.TCP/IP 수 있 이를 위해,그리고 프로토콜을 준비한 보낸 사람을 느리게(응용 프로그램 계층에서,아마 당신이 알아야 할 모든 당신은 다른 쪽 끝에서,차단 작성화를 차단,블로킹 기록이 실패하고,비동기를 쓰지 않을 것이 완료될 때까지 충분히 읽 데이터를 수 있다).

응용 프로그램 계층에서 당신은 대략적인 수 있습니다-당신은 할 수 없습니 보장 하드 같은 제한을"보다는 더 이상 10kb 통과할 것이 특정 시점에서 네트워크 중 하나에서 두 번째".하지만 경우에 당신은 무엇인지를 추적을 받았을 얻을 수있는,평균 오른쪽에 실행됩니다.

다른 팁

가정 네트워크 전송,TCP/IP 기반으로 한,패킷에 대한 응답으로 보내는 ACK/NACK 패킷의 다른 방법이다.

의 속도를 제한하의 패킷을 인정 받은 패킷을 수신,당신이 감소해 평가하는 새로운 패킷을 전송됩니다.

를 일으킬 수 있다는 겁니다 부정확한,그래서 그 가능성이 최적의 모니터 다운스트림을 평가하고 조정 응답 비율을 적응까지 떨어지는 내 편안한 임계값입니다.(이것은 일어날 것이 정말 빠른 그러나,당신이 보내 dosens 의 ack 를 두번째)

그것은 그 때와 같은 제한 게임을의 특정 번호를 FPS 입니다.

extern int FPS;
....    
timePerFrameinMS = 1000/FPS;

while(1) {
time = getMilliseconds();
DrawScene();
time = getMilliseconds()-time;
if (time < timePerFrameinMS) {
   sleep(timePerFrameinMS - time);
}
}

이 방법은 당신이 있는지 확인 게임을 재생률에 있을 것이 가장 FPS 입니다.동일한 방식으로 DrawScene 될 수 있는 기능을 사용하여 펌핑 바이트로 소켓 스트림입니다.

를 읽는 경우에는 소켓을 제어할 수 있는 권한이 없습을 통해 대역폭 사용-당신은 읽는 운영체제의 버퍼의 소켓을,그리고 아무것도 당신이 말한 것들에게 쓰는 사람에게 소켓 덜 쓰 데이터(지 않는 한,당연히,당신은 당신이 일을 위한 프로토콜는).

모두 읽고 느리게 할 것이로 채워 버퍼,원인과 결국 축사에서 네트워크 엔드-하지만 당신은 제가 언제,어떻게 이 발생합니다.

만약 당신이 정말로 원하는 읽기만 너무 많은 데이터 시간에,당신은 다음과 같이 할 수 있다:

ReadFixedRate() {
  while(Data_Exists()) {
    t = GetTime();
    ReadBlock();
    while(t + delay > GetTime()) {
      Delay()'
    }
  }
}

wget 것은 그것을 관리와--제한-속도 옵션을 선택합니다.여기에서 남자 페이지:

Note Wget 를 구현하고 제한 자기의 적절한 금액 시간 후에 네트워크 읽기는 했 보다 짧은 시간에 의해 지정 율입니다.결국 이 전략의 원인 TCP 전송 속도가 느려 약은 지정된 속도로 제한할 수 있습니다.그러나,그것은 시간이 걸릴 수 있습니다 이러한 균형을 달성할 수 있도록하지 않는 놀라게 될 경우 제한 평가 이 잘 작동하지 않는 아주 작은 파일이 있습니다.

로 다른 말했다,운영체제 커널은 트래픽을 관리하고 당신은 단순히 읽기 데이터의 복사본 커널 메모리입니다.약 속도를 제한 하나요 프로그램을 지연의 읽기 데이터의 허용오 패킷을 버퍼까지는 커널에서는 느리게 인정 받는 패킷을 감소에서는 하나의 소켓에.

하려는 경우 느리게 모든 트래픽을 컴퓨터를 이동해야와의 크기를 조정하고 수신 TCP 버퍼입니다.리눅스에서,당신은 당신이 변화를 변경하여 값은/proc/sys/net/ipv4/tcp_rmem(읽 메모리 버퍼 크기)및 다른 tcp_*파일이 있습니다.

추가 Branan 의 대답:

는 경우 자발적으로 제한 읽기 속도를 수신기에서 끝에 결국 큐를 채울 것입니다 모두에서 끝입니다.다음 보낸 것 중 하나 구획에는 send()호출이 반환 또는에서 보내()호출 sent_length 미만 예상 길이에 전달하는 send()호출합니다.

는 경우에 보낸 사람에게 준비되지 않을 다루는 이것에 의한 경우가 자고 노력하고 다시되지 않은 것에 맞 OS 버퍼,당신이 끝나는 연결 문제가 발생(보낸 사람을 감지할 수 있으로 이는 오류)또는 데이터의 손실(보낸 사람도 무의식적으로 버리는 데이터에 적합하지 않은 OS 버퍼).

설정하는 작은 소켓을 보내고 수신 버퍼,말 1k 또는 2k,이 같은 대역폭*지체 제품=버퍼 크기입니다.지 않을 수도 있습은 그것을 얻을 수있을만큼 작은 이상 빠르게 링크입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top