看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
LiloHuang: Sleep(1) 的精度只到 millisecond,可用 select 來模擬 07/10 09:34
LiloHuang: 精度達到 us。可用 std::this_thread::sleep_for( 07/10 09:35
LiloHuang: std::chrono::microseconds(usec)); 或用 boost 版本 07/10 09:35
LiloHuang: 比較取巧但不好的做法就是用 busy loop 來 sleep 07/10 09:38
感謝回應! 在看完大大的建議後,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
LiloHuang: select 在 Windows 上得搭配 dummy fd_set 才能使用 07/11 16:17
LiloHuang: http://goo.gl/lxPcKK 看看這篇文章的做法 07/11 16:17
LiloHuang: 另外有 busy loop 版的 usleep https://goo.gl/cGW5pu 07/11 16:21
LiloHuang: 不過其實 UDP 有很多缺點啦,你應該需要有 AIMD 的傳輸 07/11 16:28
LiloHuang: 才能真的達到 congestion control 以及 retransmission 07/11 16:29
LiloHuang: 可以考慮看看用這個 http://udt.sourceforge.net/ 07/11 16:29