• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            UDP丟包原因

            轉載自:http://www.cnblogs.com/mengyan/archive/2012/10/04/2711340.html

            一、主要丟包原因

            1、接收端處理時間過長導致丟包:調用recv方法接收端收到數據后,處理數據花了一些時間,處理完后再次調用recv方法,在這二次調用間隔里,發過來的包可能丟失。對于這種情況可以修改接收端,將包接收后存入一個緩沖區,然后迅速返回繼續recv。

            2、發送的包巨大丟包:雖然send方法會幫你做大包切割成小包發送的事情,但包太大也不行。例如超過50K的一個udp包,不切割直接通過send方法發送也會導致這個包丟失。這種情況需要切割成小包再逐個send。

            3、發送的包較大,超過接受者緩存導致丟包:包超過mtu size數倍,幾個大的udp包可能會超過接收者的緩沖,導致丟包。這種情況可以設置socket接收緩沖。以前遇到過這種問題,我把接收緩沖設置成64K就解決了。
            int nRecvBuf=32*1024;//設置為32K
            setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

            具體設置代碼可以參考下面鏈接:
            http://blog.sina.com.cn/s/blog_a459dcf5010153mp.html

            4、發送的包頻率太快:雖然每個包的大小都小于mtu size 但是頻率太快,例如40多個mut size的包連續發送中間不sleep,也有可能導致丟包。這種情況也有時可以通過設置socket接收緩沖解決,但有時解決不了。所以在發送頻率過快的時候還是考慮sleep一下吧。

            5、局域網內不丟包,公網上丟包。這個問題我也是通過切割小包并sleep發送解決的。如果流量太大,這個辦法也不靈了。總之udp丟包總是會有的,如果出現了用我的方法解決不了,還有這個幾個方法: 要么減小流量,要么換tcp協議傳輸,要么做丟包重傳的工作。

             

             

            二、具體問題分析

            1.發送頻率過高導致丟包

            很多人會不理解發送速度過快為什么會產生丟包,原因就是UDP的SendTo不會造成線程阻塞,也就是說,UDP的SentTo不會像TCP中的SendTo那樣,直到數據完全發送才會return回調用函數,它不保證當執行下一條語句時數據是否被發送。(SendTo方法是異步的)這樣,如果要發送的數據過多或者過大,那么在緩沖區滿的那個瞬間要發送的報文就很有可能被丟失。至于對“過快”的解釋,作者這樣說:“A few packets a second are not an issue; hundreds or thousands may be an issue.”(一秒鐘幾個數據包不算什么,但是一秒鐘成百上千的數據包就不好辦了)。 要解決接收方丟包的問題很簡單,首先要保證程序執行后馬上開始監聽(如果數據包不確定什么時候發過來的話),其次,要在收到一個數據包后最短的時間內重新回到監聽狀態,其間要盡量避免復雜的操作(比較好的解決辦法是使用多線程回調機制)。

            2.報文過大丟包

            至于報文過大的問題,可以通過控制報文大小來解決,使得每個報文的長度小于MTU。以太網的MTU通常是1500 bytes,其他一些諸如撥號連接的網絡MTU值為1280 bytes,如果使用speaking這樣很難得到MTU的網絡,那么最好將報文長度控制在1280 bytes以下。

            3.發送方丟包

            發送方丟包:內部緩沖區(internal buffers)已滿,并且發送速度過快(即發送兩個報文之間的間隔過短);  接收方丟包:Socket未開始監聽;  雖然UDP的報文長度最大可以達到64 kb,但是當報文過大時,穩定性會大大減弱。這是因為當報文過大時會被分割,使得每個分割塊(翻譯可能有誤差,原文是fragmentation)的長度小于MTU,然后分別發送,并在接收方重新組合(reassemble),但是如果其中一個報文丟失,那么其他已收到的報文都無法返回給程序,也就無法得到完整的數據了。 

            posted on 2013-01-15 15:20 楊粼波 閱讀(938) 評論(0)  編輯 收藏 引用

            国产成人精品三上悠亚久久| 中文字幕精品久久久久人妻| 久久国产精品99精品国产987| 久久九九青青国产精品| 草草久久久无码国产专区| 久久夜色精品国产亚洲| 97精品久久天干天天天按摩| 女同久久| 久久精品国产只有精品2020| 亚洲一区精品伊人久久伊人| 久久精品欧美日韩精品| 久久亚洲2019中文字幕| 国产精品久久波多野结衣| 亚洲另类欧美综合久久图片区| 国产∨亚洲V天堂无码久久久| 亚洲国产精品成人久久蜜臀| 亚洲国产天堂久久综合网站| 久久综合给合久久国产免费 | 99久久综合狠狠综合久久| 亚洲国产精品无码久久久久久曰| 91精品国产色综合久久| 久久人人爽人人爽人人片AV高清 | 精品久久人人妻人人做精品| 国内精品伊人久久久久av一坑| 精品久久久一二三区| 久久免费香蕉视频| 久久综合丁香激情久久| 久久综合狠狠综合久久综合88| 亚洲精品乱码久久久久久按摩| 性做久久久久久免费观看| 久久一区二区三区99| 国产无套内射久久久国产| .精品久久久麻豆国产精品| 久久精品人人做人人爽97| 亚洲国产精品嫩草影院久久| 色综合久久久久综合99| 久久久久亚洲精品男人的天堂| 精品久久久无码中文字幕天天| 91久久成人免费| 久久久久国产成人精品亚洲午夜| 国产免费久久精品99久久|