2012-05-17 26 views
5

thể trùng lặp:
How do you throttle the bandwidth of a socket connection in C?Làm cách nào để hạn chế tốc độ socket trong C?

Tôi đang viết một máy chủ FTP đơn giản trong C cho một môi trường Unix. Là một tính năng của máy chủ, tôi muốn giới hạn tốc độ tải lên/tải xuống của người dùng.

  1. Có chức năng thư viện nào trực tiếp giải quyết vấn đề này không?

  2. Nếu không, thuật toán được sử dụng trong máy chủ FTP sản xuất là gì? Tôi có một giải pháp rất ngây thơ: tính toán số lượng byte sẽ gửi trong một giây, giả sử x, write(x) hoặc read(x) và sau đó sleep(1).

Nên có giải pháp tốt hơn. Thậm chí tốt hơn nếu có các mẫu mã.

Để rõ ràng, tôi đang sử dụng Mac OS X, nhưng tôi muốn nó cũng có thể chạy dưới Ubuntu hoặc một số Linux.

+0

* "Là một tính năng của máy chủ, tôi muốn giới hạn tốc độ tải lên/tải về của một người sử dụng" * - Đó là âm thanh như một tính năng tuyệt vời –

+0

Bạn đang sử dụng hệ điều hành nào? – jman

+1

Câu hỏi này có thể giúp - http://stackoverflow.com/questions/235762/how-do-you-throttle-the-bandwidth-of-a-socket-connection-in-c –

Trả lời

0

Bạn có chắc chắn muốn thực hiện việc này không? Động cơ của bạn có làm phiền người dùng của bạn không? (đây là động cơ hợp pháp - xem bất kỳ trang web "tải lên miễn phí" nào)

Hạn chế băng thông như thế này không phải là cách hay để bảo vệ máy chủ của bạn khỏi tình trạng quá tải. mọi người sẽ tìm thấy các khách hàng được tạo luồng và mở các phiên FTP đồng thời ...

có chức năng thư viện nào để làm điều đó không?

Có thể không, định hình băng thông là nhiệm vụ hệ điều hành không phải là nhiệm vụ dịch vụ.

thuật toán là gì?

Cách bạn mô tả âm thanh khá hiệu quả.

Để làm cho nó tốt hơn có thể xem có bao nhiêu octet đã được đọc hoặc viết và đã dành bao nhiêu thời gian trước khi quyết định ngủ. Hãy xem xét trường hợp máy khách chậm hơn giới hạn của bạn: các lần đọc và ghi sẽ kết thúc việc chặn và giấc ngủ của bạn() sẽ chỉ thêm độ trễ không cần thiết. điều này cũng sẽ làm giảm hiệu ứng ẩn của độ trễ đĩa vv từ người dùng.

Bạn có thể cân nhắc sử dụng chế độ ngủ hoặc nanô để có độ phân giải tốt hơn cả hai đều ở dạng posix nên có trên OSX * BSD và linux.

0

FTP là giao thức lớp ứng dụng. FTP có thể chạy trên các cổng TCP hoặc UDP. (EDIT: tftp và uftp chạy trên UDP, xin xem phần bình luận để biết chi tiết)

Socket Tốc độ là một chức năng của sau:

  1. Tốc độ liên kết: 10/100 Base T và vân vân.
  2. BER của liên kết: Tỷ lệ lỗi bit (thường là trong thế giới ngày nay của nó thường thấp 10 đến sức mạnh -9 hoặc một cái gì đó của loại đó. Có lỗi burst là tốt.
  3. Ổ cắm đệm kích thước: /proc/sys/net/core thông số

Trên Linux: Đối xử lý Socket TCP đây là một bài viết tốt [1]

4.Tweak ngăn xếp để lọc/gói thả để giới thiệu sự mất mát gói, do đó cuối cùng điều chỉnh tốc độ dòng chảy: Các công cụ như netem [2] giúp bạn điều chỉnh các thùng để điều tiết lưu lượng.

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

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

+2

"FTP có thể chạy trên ổ cắm UDP" ... yêu cầu này yêu cầu bằng chứng. –

+1

Để tránh các cuộc thảo luận từ digression đến FTP tôi đã không cung cấp chi tiết ở đó. 1. tftp chạy trên cổng udp 69 cho tốc độ. 2. Có uftp mà là một chuyển tập tin đa diễn viên cung cấp mã hóa cho an ninh. –

+1

Các tệp chuyển TFTP, nhưng không phải là FTP. Ditto uftp. –