一種簡單的UDP網路重傳機制

2021-06-28 13:52:45 字數 1244 閱讀 8828

工作一年多,在技術層面上一直沒有太大的成就。總感覺每天都在重複著一件事情,需求,改,需求,再改。在這種重複中,開始變得有些暴躁。很希望能也有所突破,今天剛剛開通了csdn部落格。決定在這個滿是大牛的平台上,留下自己的每一點學習過程,也在大家面前呈現自己的程式設計錯誤和誤區。希望各位大牛能不惜賜教,對文章中有的錯誤一定要指出來,這會是我最大的收穫。

前段時間,經手乙個網路相關軟體的開發。由於是新手,在接觸到這個專案的時候一時沒有太多的頭緒。其中有乙個關於udp網路傳輸中的重傳問題,思考了好久自己只能想到乙個很耗費資源和排程的方法。最初的想法是這樣的:

功能要求是訊息傳送間隔1秒,需要有三次重傳的機制,當超過三次則改傳送間隔為3秒。

1、建立訊息處理結構:包括訊息id、訊息狀態(是否傳送成功)、重傳次數、重傳超時時間。

2、建立接收訊息執行緒,當受到訊息時,通過訊息的id將訊息的狀態設定為傳送成功。

3、建立傳送訊息方法,將訊息加入傳送佇列,呼叫執行緒迴圈:判斷訊息狀態(break)、傳送訊息、sleep、重傳次數++、判斷重傳次數,修改sleep時間。

如此一來,雖說實現了訊息的傳送,但是對於程式的執行起來,每一次傳送都需要新起呼叫執行緒進行處理。一來程式的開銷變得很大;二來,受windows系統執行緒最大數量的限制,當連續收發一段時間之後軟體最終崩潰了。查詢得知可能是系統限制上的問題之後,居然考慮到了呼叫執行緒池的方式來處理這樣的問題。在進行過一番嘗試之後,發現這樣的處理只是使這一塊的排程變得很是複雜,且多執行緒之間的資料同步也出現了問題。後來在老大的建議和方案之下,進行了如下的改進。這裡就用簡單的**進行說明下。

class message
//記錄訊息的傳送狀態
public datetime sendtime //記錄訊息傳送的時間
public int sendcounts //記錄訊息傳送的次數
public int timeout //超時時間
...//其他與訊息有關的項
}
在訊息傳送處理的同一事務中(注:事務在迴圈執行)。查詢當前時間和訊息傳送時間的差值。

if (msg.status != success)//判斷是否傳送成功
}
}
這樣當事務在迴圈體執行的時候會檢測訊息是否傳送成功,也會根據傳送時間來判斷處理超時重發和超時將時間延長的處理了。

上面的**根據腦海中存留的思路進行書寫的,可能在正式的使用中會出現很多問題。這裡只是將這個處理過程寫下來,希望能得到好的建議和改進優化的方法。

udp可靠傳輸的一種

udp廣播示例 unix套接字可靠傳輸 只能客戶端到服務端,服務端無法sendto 接收端recvfrom介紹 本地程序間通訊方式的一種,unix可靠傳輸 接收端rec.c include include see notes include include include include inclu...

Socket 網路服務提供的一種機制

網路程式設計 網路通訊的要素 ip,埠,協議 tcp udp 127.0.0.1本機位址 預設主機名 localhost 有效埠 0 65535其中0 1024是系統使用或保留埠 協議 udp 不需要建立連線,不可靠,速度快,資料大小64kb tcp 需要建立連線,形成傳輸資料的通道,三次握手,可靠...

網路 簡單的UDP網路程式

udp網路程式設計的小前提 其大致流程如下 udp伺服器和客戶端實現需要的標頭檔案 include include include 主要分為以下4個板塊 服務端 server include include include include include include include intmai...