在udp可靠傳輸領域,能與udx比較的協議,目前應該只有vtcp。
今天我們談一下各種協議的緩衝問題。
滑動視窗演算法,是比較重要的演算法。
視窗越大,那麼可以一次性提交的資料量就會越大,可以在網路中漂流的資料量也越大,意味著吞吐量越大。
udx支援從8kb~16m的緩衝,vtcp是8k~4mb截止本文目前為止。如果以rtt = 100ms的網路,最大吞吐量,理論值分別是16m * 1000/100 = 160mb,和40mb.這裡只是理論值,最大為多少,要看具體的環境,因為影響吞吐量除了延遲,還有丟包。
今天,我就udx協議在程式設計時對緩衝設計上,進行限制。
udx協議控制緩衝的機制,和底層協議實現有很大關係,udx協議,實現的原則是傳送的內容和接收的內容完全一致原則,每成功傳送一次,必會通知應用傳送完成。什麼意思呢?使用者可以這樣操作,傳送乙個100kb的資料報,比如udx.sendbuff(100kb),接收方觸發接收事件onstreamread(pdata,100kb)的時候,pdata的內容完全和你呼叫傳送時一樣,而傳送方會收到onstreamwrite(pdata,100kb)的傳送成功的通知,一一對應關係。這樣的好處是,使用者只用關心自己的業務不用關心網路底層的分包,組包。
比如,使用者傳送自己的協議資料,資料結構,等,可以完全直接強制轉化為傳送內容。這對複雜的業務來說,是非常有用的功能,使開發人員只用關心自己的業務功能,定製功能即可。
由於有以上的機制,那麼, 我們就可以控制這個,緩衝長度了。我們可以這樣理解,呼叫sendbuff成功後,可以理解為,使用者已經將資料拷貝給udx緩衝,而還沒有到達使用者端,停留在網路上的資料量,這個量為多大就是我們設定的緩衝了。如何控制這個長度就是我們今天要說的問題。
我們可以這樣解決,我們設定兩個變數,用來分別統計傳送的長度,和通知完成的長度。這裡有兩個分支方法,你可以通過呼叫次數來統計,也可以用傳送的長度來統計,前者粗略一點,後者更精確一點。
我們先以簡單的傳送個數來統計。
如以下**
if(udx.sendbuff(data,len)
m_sendcount ++;
m_sendsize += len;
在onstreamwrite事件中
void cp2pvideoclientdlg::onstreamwrite(iudxtcp * ptcp,byte* pdata,int len){
m_sendcountack ++;
m_sendsizeack += len;
那麼,緩衝長度控制可以這樣寫
int dcount = m_sendcount - m_sendcountack;
int dsize = m_sendsize - m_sendsizeack;
{//停止傳送,等網路恢復
return;
if(udx.sendbuff(data,len))
m_sendcount ++;
m_sendsize += len;
同理,用長度精確控制**與上面差不多,大家可以自己發揮。
如何控制dedecms描述的長度?
我們都知道呼叫dedecms的標題長度可以用titlelen 字元數 表示標題長度為10個字元,也即是5個漢字。如果想要控制描述的呼叫長度可以實現嗎?隨ytkah一起去看看吧 一 比較簡單的一種方法 field description function cn substr me,字元數 這個很快就能...
如何控制dedecms描述的長度?
我們都知道呼叫dedecms的標題長度可以用titlelen 字元數 表示標題長度為10個字元,也即是5個漢字。如果想要控制描述的呼叫長度可以實現嗎?隨ytkah一起去看看吧 一 比較簡單的一種方法 field description function cn substr me,字元數 這個很快就能...
如何控制gridview編輯狀態的長度
控制編輯狀態下文字框的寬度 這種方式有點複雜,可以用模板列實現 我們上面已經分析過gridview每一行的建造過程了,它包含 建立行 和 繫結行 兩步操作,建立行 的過程中會把一些靜態的東西建立出來,當然也包含文字框的建立。因此我們只需要在rowcreated事件中把編輯列中的文字框的長度改變一下就...