作者r596twy (湯姆熊)
看板C_and_CPP
標題[問題] 如何在socket傳輸資料中控制流量?
時間Fri Jul 10 08:36:40 2015
開發平台(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: 不過其實 UDP 有很多缺點啦,你應該需要有 AIMD 的傳輸 07/11 16:28
→ LiloHuang: 才能真的達到 congestion control 以及 retransmission 07/11 16:29