[問題] 如何在socket傳輸資料中控制流量?

看板C_and_CPP (C/C++)作者 (湯姆熊)時間10年前 (2015/07/10 08:36), 10年前編輯推噓5(505)
留言10則, 1人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Visual Studio 2013 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) winsock2.h Ws2_32.lib 問題(Question): 寫了一個由server傳送資料和client接收資料的socket程式 因為主要用途是要用在影音串流 所以是採用UDP 而我想控制並限定server每秒傳送給client端的流量 但不清楚該如何作... 補充說明(Supplement): 因為傳送的資料是二進位格式 所以目前傳送與接收檔案的方式,分別是用傳訊息的方式 用sendto和recvfrom來達成 目前沒有限定流量的情況下 每秒約可達到160Mbps 原本想透過Sleep來達到控制每秒可傳送資訊的流量效果 但是當我試圖用Sleep(1),也就是每1ms控制server傳送一次資料時 每秒流量卻下降至約200Kbps... 實在超出自己預計希望下降至的流量太多 所以想請問各位大大在實作控制server傳輸流量的經驗與手法 望各位大大能幫我解惑了 感恩~~<(_ _)> -- ╔《新版十二生肖》═════════════════════════════╗ ║ ◣◣ ˍ ║ ●●╰‧‧ [ ] ιι . . - - ˍ▁ '' .. '〒' '. ' ' ' ξ . . '@@ ' ˊˋ ★︰ / ██╯ / @@@@ █◤ ˋˊ ║ ╚═══" " ════════════ ""══"═"════════liszt1025╝ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 112.104.118.100 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1436488604.A.21F.html

07/10 09:34, , 1F
Sleep(1) 的精度只到 millisecond,可用 select 來模擬
07/10 09:34, 1F

07/10 09:35, , 2F
精度達到 us。可用 std::this_thread::sleep_for(
07/10 09:35, 2F

07/10 09:35, , 3F
std::chrono::microseconds(usec)); 或用 boost 版本
07/10 09:35, 3F

07/10 09:38, , 4F
比較取巧但不好的做法就是用 busy loop 來 sleep
07/10 09:38, 4F
感謝回應! 在看完大大的建議後,select和sleep_for都去嘗試了 select搭配socket能夠正常使用 但select似乎一定要綁著socket來使用?? 想讓這邊的select當作一個單純作等待的功用 所以嘗試只對第一個nfds和最後一個timeval傳入參數 而其餘三個fd_set的參數都代入NULL 但結果似乎不能等待,沒有任何延遲效果 想問select的等待用法只能夠檢查socket是否有收發訊息才能用嗎? sleep_for,要宣告<thread> 而這邊的等待時間能夠正常運作 但不知為何 當我宣告<thread>之後 recvfrom本身所具有的阻塞式等待效果會失效 而且select不管怎樣設定參數,也會變成阻塞式(不確定如果有收到訊息後,是否會跳出來) 有點不清楚為何一個宣告會造成這麼多影響 ※ 編輯: r596twy (112.104.118.100), 07/11/2015 08:58:05

07/11 16:17, , 5F
select 在 Windows 上得搭配 dummy fd_set 才能使用
07/11 16:17, 5F

07/11 16:17, , 6F
http://goo.gl/lxPcKK 看看這篇文章的做法
07/11 16:17, 6F

07/11 16:21, , 7F
另外有 busy loop 版的 usleep https://goo.gl/cGW5pu
07/11 16:21, 7F

07/11 16:28, , 8F
不過其實 UDP 有很多缺點啦,你應該需要有 AIMD 的傳輸
07/11 16:28, 8F

07/11 16:29, , 9F
才能真的達到 congestion control 以及 retransmission
07/11 16:29, 9F

07/11 16:29, , 10F
可以考慮看看用這個 http://udt.sourceforge.net/
07/11 16:29, 10F
文章代碼(AID): #1LdnES8V (C_and_CPP)
文章代碼(AID): #1LdnES8V (C_and_CPP)