2012-05-17 6 views
5

가능한 중복 : 나는 유닉스 환경 C에서 간단한 FTP 서버를 쓰고 있어요
How do you throttle the bandwidth of a socket connection in C?C에서 소켓 속도를 어떻게 제한합니까?

. 서버의 기능으로 사용자의 업로드/다운로드 속도를 제한하고 싶습니다.

  1. 이 문제점을 직접 해결하는 라이브러리 함수가 있습니까?

  2. 그렇지 않은 경우 프로덕션 FTP 서버에 사용되는 알고리즘은 무엇입니까? 나는 매우 순진한 해결책을 가지고있다. 초 안에 보낼 바이트 수를 계산하라. 예를 들어 x, write(x) 또는 read(x), 그리고 sleep(1).

더 나은 해결책이 있어야합니다. 코드 샘플이 있으면 더 좋습니다.

분명히하려면 Mac OS X을 사용하고 있지만 우분투 또는 일부 Linux에서도 실행되기를 바랍니다.

+0

는 * "서버의 기능으로, 나는 사용자의 업로드/다운로드 속도를 제한하려면"* - 그 멋진 기능 –

+0

같은 소리 어떤 OS를 사용하고 있습니까? – jman

+1

이 질문은 도움이 될 수도 있습니다 - http://stackoverflow.com/questions/235762/how-do-you-throttle-the-bandwidth-of-a-socket-connection-in-c –

답변

0

정말 하시겠습니까? 사용자를 괴롭히는 동기가 있습니까? (이것은 합법적 인 동기입니다. 여러 무료 업로드 사이트 중 하나를 참조하십시오.)

대역폭 제한은 서버를 과부하로부터 보호하는 좋은 방법이 아닙니다. 사람들은 스레드 클라이언트를 발견하고 동시 FTP 세션을 엽니 다 ...

거기에 라이브러리 기능이 있습니까?

대역폭 셰이핑은 서비스 작업이 아닌 OS 작업입니다.

알고리즘이란 무엇입니까?

당신이 묘사 한 것이 상당히 효과적이라고 들립니다.

더 잘 만들려면 몇 개의 8 진수가 읽혀 지거나 쓰여 졌는지, 잠자기 전에 얼마나 많은 시간을 소비했는지 살펴볼 수 있습니다. 클라이언트가 제한보다 느린 경우를 생각해보십시오. 읽기 및 쓰기가 차단되고 sleep()이 불필요한 대기 시간을 추가합니다. 이렇게하면 사용자가 디스크 대기 시간 등의 숨김 효과를 줄일 수 있습니다.

미세 조정을 위해 usleep 또는 nanosleep을 사용하는 것이 좋습니다 둘 다 posix에 있으므로 OSX * BSD 및 Linux에 있어야합니다.

0

FTP는 응용 프로그램 계층 프로토콜입니다. FTP는 TCP 또는 UDP 소켓에서 실행될 수 있습니다. 그래서 10/100베이스 T와 :

  1. 링크 속도 :

    한 Socket 속도는 다음의 기능입니다 : (EDIT TFTP 및 UDP에 uftp 실행은, pls는 세부 사항에 대한 코멘트 섹션 참조).

  2. 링크의 비트 오류율 : 비트 오류율 (일반적으로 오늘의 세계에서 일반적으로 전력이 10이나 그보다 낮습니다. 버스트 오류도 있습니다.
  3. 소켓 버퍼 크기 : /proc/sys/net/core 파라미터
  4. 리눅스

다음 TCP 소켓을 처리하기 위해 여기에 [1]

4.Tweak 스택이 패킷 손실을 도입/드롭 된 패킷을 필터링하는 것이 기사, 따라서 결국 유량을 조절합니다 : netem [2]와 같은 도구는 유량을 조절하기 위해 버킷을 조정하는 데 도움이됩니다.

[1] http://www.cyberciti.biz/faq/linux-tcp-tuning/

[2] http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

+2

"FTP는 UDP 소켓에서 실행될 수 있습니다."...이 주장에는 증거가 필요합니다. –

+1

FTP 로의 회피를 피하기 위해 여기에 세부 정보를 제공하지 않았습니다. 1. tftp는 UDP 포트 69에서 실행됩니다. 2. 보안을위한 암호화를 제공하는 멀티 캐스트 파일 전송 인 uftp가 있습니다. –

+1

TFTP는 파일을 전송하지만 FTP가 아닙니다. 상응. –

관련 문제