專利名稱:數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送方法和裝置的制作方法
數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送方法和裝置技術(shù)領(lǐng)域
本申請涉及數(shù)據(jù)通信技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送方法和裝置。
背景技術(shù):
當(dāng)前的數(shù)據(jù)通信設(shè)備中,在事務(wù)處理和通信流程之間經(jīng)常會出現(xiàn)矛盾,這種矛盾主要是由于兩者之間的不同步造成的,比如處理完某一事務(wù)然后等待發(fā)送成功再處理下一個事務(wù)則會大大降低效率,當(dāng)然,如果必須等待則另當(dāng)別論。但是,如果處理不需要依賴發(fā)送的成功,比如流媒體或者某些網(wǎng)絡(luò)游戲等等,則要考慮一種更好的方法來解決這個問題了。
解決方法之一是建立一個發(fā)送數(shù)據(jù)的發(fā)送隊列,然后處理程序?qū)⒁l(fā)送的數(shù)據(jù)放入隊列,然后通信程序從發(fā)送隊列的另一端取出數(shù)據(jù)發(fā)送。這個也是一個標準的生產(chǎn)者消費者模型業(yè)務(wù)處理程序是生產(chǎn)者,通信程序是消費者,兩者在不同的任務(wù)中運行,而產(chǎn)品則是待發(fā)送的數(shù)據(jù)。這樣業(yè)務(wù)處理程序可以不間斷地處理自己的邏輯,只需要把每次處理的結(jié)果數(shù)據(jù)放入這個發(fā)送隊列即可。在該采用發(fā)送隊列的數(shù)據(jù)發(fā)送技術(shù)中,都是將數(shù)據(jù)直接放入到發(fā)送隊列中,由一個專門的發(fā)送任務(wù)取其中的數(shù)據(jù)進行發(fā)送,發(fā)送完成后即出隊。
現(xiàn)有的上述數(shù)據(jù)發(fā)送技術(shù),對于無狀態(tài)機的數(shù)據(jù)是適用的。但是對于具有狀態(tài)機、 并需要順序處理的數(shù)據(jù),則并不適用。所述具有狀態(tài)機并需要順序處理的數(shù)據(jù)是指待發(fā)送的數(shù)據(jù)有至少2個狀態(tài),后面的數(shù)據(jù)必須等待前面的數(shù)據(jù)狀態(tài)變化到下一狀態(tài)后,自身才能得到對應(yīng)的處理。在這種情況下要保證待發(fā)送數(shù)據(jù)能被順序處理和狀態(tài)正常變化,如果還是采用現(xiàn)有的發(fā)送隊列技術(shù)機制則行不通?,F(xiàn)有技術(shù)中有采用增添新的非隊列技術(shù)之外的新模塊來保證這些需求,但是這種現(xiàn)有技術(shù)又會增加發(fā)送設(shè)備的復(fù)雜度和成本,降低了發(fā)送設(shè)備的工作效率和發(fā)送設(shè)備的可維護性。發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送方法和裝置, 既可以發(fā)送具有狀態(tài)機、并需要順序處理的數(shù)據(jù),同時減小發(fā)送設(shè)備的復(fù)雜度和成本,提高設(shè)備的工作效率和可維護性。
本發(fā)明的技術(shù)方案是這樣實現(xiàn)的
—種數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送方法,應(yīng)用于分布式的網(wǎng)絡(luò)通信設(shè)備中,該方法中數(shù)據(jù)發(fā)送部件和數(shù)據(jù)接收部件間的數(shù)據(jù)發(fā)送交互流程的狀態(tài)機包括η個狀態(tài),η為大于等于2 的正整數(shù);該方法包括
創(chuàng)建發(fā)送隊列,設(shè)置和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)指針以及當(dāng)前新數(shù)據(jù)入隊指針,并將所述指針初始化為指向發(fā)送隊列的第一個數(shù)據(jù);
創(chuàng)建和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)發(fā)送任務(wù);
創(chuàng)建用于接收來自數(shù)據(jù)接收部件的交互指令數(shù)據(jù)的接收任務(wù);
數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊有數(shù)據(jù)要發(fā)送時,將待發(fā)送的數(shù)據(jù)入隊到所述發(fā)送隊列,并喚醒第一個狀態(tài)發(fā)送任務(wù);
第一個狀態(tài)發(fā)送任務(wù)在被喚醒后,記錄當(dāng)前新數(shù)據(jù)入隊指針,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始遍歷,到記錄的當(dāng)前新數(shù)據(jù)入隊指針指向的數(shù)據(jù)的前一個數(shù)據(jù)遍歷結(jié)束,依次發(fā)送遍歷的數(shù)據(jù)到數(shù)據(jù)接收部件;
接收任務(wù)接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),確定該交互指令數(shù)據(jù)所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù)及需進入的下一個狀態(tài)即第m個狀態(tài)后,將所述已發(fā)送數(shù)據(jù)的狀態(tài)更新為第m個狀態(tài),并喚醒第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程;
其中,所述第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程包括如下步驟,m為大于等于2、小于等于η的正整數(shù)
Α、將發(fā)送隊列中的第m個狀態(tài)指針指向的已發(fā)送數(shù)據(jù)作為當(dāng)前數(shù)據(jù);
B、判斷當(dāng)前數(shù)據(jù)的狀態(tài)是否為第m個狀態(tài),如果是則執(zhí)行下一步驟,否則結(jié)束本發(fā)送流程;
C、發(fā)送當(dāng)前數(shù)據(jù)的第m個狀態(tài)對應(yīng)需發(fā)送的交互指令數(shù)據(jù),將所述第m個狀態(tài)的指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置;
D、判斷該第m個狀態(tài)是否為最后一個狀態(tài),如果是則進一步將當(dāng)前數(shù)據(jù)移出所述隊列,結(jié)束本流程;否則執(zhí)行下一步驟;
E、判斷第m個狀態(tài)指針與第m-Ι個狀態(tài)指針所指的位置是否相同,如果是則結(jié)束本發(fā)送流程,否則返回步驟A。
優(yōu)選的,所述數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊有數(shù)據(jù)要發(fā)送時,將待發(fā)送的數(shù)據(jù)入隊到所述發(fā)送隊列的具體方法為將數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊待發(fā)送數(shù)據(jù)的狀態(tài)設(shè)置為第一個狀態(tài),并將待發(fā)送數(shù)據(jù)依次入隊到發(fā)送隊列,并在每入隊一個數(shù)據(jù)后,移動當(dāng)前新數(shù)據(jù)入隊指針到發(fā)送隊列中存放數(shù)據(jù)的下一個位置,直至將本次待發(fā)送數(shù)據(jù)入隊完成。
優(yōu)選的,所述第一個狀態(tài)發(fā)送任務(wù)在被喚醒后,記錄當(dāng)前新數(shù)據(jù)入隊指針,從第一個狀態(tài)指當(dāng)前針所指向的數(shù)據(jù)開始遍歷,到記錄的當(dāng)前新數(shù)據(jù)入隊指針指向的數(shù)據(jù)的前一個數(shù)據(jù)遍歷結(jié)束,依次發(fā)送遍歷的數(shù)據(jù)到數(shù)據(jù)接收部件,具體包括第一個狀態(tài)發(fā)送任務(wù)在被喚醒后,記錄發(fā)送隊列當(dāng)前新數(shù)據(jù)入隊指針的位置,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始發(fā)送,每發(fā)送一個數(shù)據(jù),將所述第一個狀態(tài)指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置,判斷所述第一個狀態(tài)指針與所述記錄的當(dāng)前新數(shù)據(jù)入隊指針的位置是否相同,如果不相同,則繼續(xù)發(fā)送當(dāng)前第一個狀態(tài)指針指向的數(shù)據(jù),如果相同則完成本次發(fā)送任務(wù)。
優(yōu)選的,接收任務(wù)接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),確定該交互指令數(shù)據(jù)所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù)及需進入的第m個狀態(tài)的具體方法為接收任務(wù)接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),根據(jù)該交互指令數(shù)據(jù)中攜帶的數(shù)據(jù)編號確定該交互指令所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù),在所述發(fā)送數(shù)據(jù)中記錄返回該交互指令數(shù)據(jù)的數(shù)據(jù)接收部件標記,并根據(jù)所述已發(fā)送數(shù)據(jù)中攜帶的目的數(shù)據(jù)接收部件信息,判斷當(dāng)前是否收到所述已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),如果是則根據(jù)所述已發(fā)送數(shù)據(jù)的當(dāng)前狀態(tài)即第m-Ι狀態(tài),判斷需進入下一狀態(tài)即第m個狀態(tài),執(zhí)行后續(xù)的流程,否則繼續(xù)接收該已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù)。
優(yōu)選的,所述記錄返回該交互指令數(shù)據(jù)的數(shù)據(jù)接收部件標記,具體包括用位圖表征每個已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件是否返回交互指令數(shù)據(jù),在收到一個目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù)后,在對應(yīng)已發(fā)送數(shù)據(jù)中將返回交互指令數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖對應(yīng)的比特位置I ;
所述已發(fā)送數(shù)據(jù)中攜帶的目的數(shù)據(jù)接收部件信息,是指應(yīng)用程序模塊在將已發(fā)送數(shù)據(jù)入隊到發(fā)送隊列之前,在已發(fā)送數(shù)據(jù)中用位圖表征該發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件,將需要接收該已發(fā)送數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖對應(yīng)的比特位置I ;
所述判斷當(dāng)前是否收到所述已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),具體包括判斷該已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件位圖是否和返回交互指令數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖相同,如果相同則判定收到該已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),否則判定還沒有收到該已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù)。
優(yōu)選的,所述的數(shù)據(jù)發(fā)送部件為所述分布式網(wǎng)絡(luò)通信設(shè)備的主控卡,所述數(shù)據(jù)接收部件為所述分布式網(wǎng)絡(luò)通信設(shè)備的線卡。
—種數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送裝置,應(yīng)用于分布式的網(wǎng)絡(luò)通信設(shè)備中的數(shù)據(jù)發(fā)送部件中,所述數(shù)據(jù)發(fā)送部件和對應(yīng)的數(shù)據(jù)接收部件間的數(shù)據(jù)發(fā)送交互流程的狀態(tài)機包括η個狀態(tài),η為大于等于2的正整數(shù);該裝置包括
發(fā)送隊列創(chuàng)建模塊,用于設(shè)置和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)指針以及當(dāng)前新數(shù)據(jù)入隊指針,并將所述指針初始化為指向發(fā)送隊列的第一個數(shù)據(jù);
發(fā)送任務(wù)創(chuàng)建模塊,用于創(chuàng)建和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)發(fā)送任務(wù)豐吳塊;
接收任務(wù)創(chuàng)建模塊,用于創(chuàng)建用于接收來自數(shù)據(jù)接收部件的交互指令數(shù)據(jù)的接收任務(wù)模塊;
入隊模塊,用于在數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊有數(shù)據(jù)要發(fā)送時,將待發(fā)送的數(shù)據(jù)入隊到所述發(fā)送隊列,并喚醒第一個狀態(tài)發(fā)送任務(wù)模塊;
第一個狀態(tài)發(fā)送任務(wù)模塊,用于在被喚醒后,記錄當(dāng)前新數(shù)據(jù)入隊指針,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始遍歷,到記錄的當(dāng)前新數(shù)據(jù)入隊指針指向的數(shù)據(jù)的前一個數(shù)據(jù)遍歷結(jié)束,依次發(fā)送遍歷的數(shù)據(jù)到數(shù)據(jù)接收部件;
接收任務(wù)模塊,用于接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),確定該交互指令數(shù)據(jù)所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù)及需進入的下一個狀態(tài)即第m個狀態(tài)后,將所述已發(fā)送數(shù)據(jù)的狀態(tài)更新為第m個狀態(tài),并喚醒第m個狀態(tài)發(fā)送任務(wù)模塊,所述m為大于等于 2、小于等于η的正整數(shù);
m個狀態(tài)發(fā)送任務(wù)模塊,其中,第m個狀態(tài)發(fā)送任務(wù)模塊包括如下單元,
第一單元,用于將發(fā)送隊列中的第m個狀態(tài)指針指向的已發(fā)送數(shù)據(jù)作為當(dāng)前數(shù)據(jù);
第二單元,用于判斷當(dāng)前數(shù)據(jù)的狀態(tài)是否為第m個狀態(tài),如果是則執(zhí)行下一單元, 否則結(jié)束本發(fā)送任務(wù);
第三單元,用于發(fā)送當(dāng)前數(shù)據(jù)的第m個狀態(tài)對應(yīng)需發(fā)送的交互指令數(shù)據(jù),將所述第m個狀態(tài)的指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置;
第四單元,用于判斷該第m個狀態(tài)是否為最后一個狀態(tài),是則進一步將當(dāng)前數(shù)據(jù)移出所述隊列,結(jié)束本發(fā)送任務(wù),否則執(zhí)行下一單元;
第五單元,用于判斷第m個狀態(tài)指針與第m-Ι個狀態(tài)指針所指的位置是否相同,如果是則結(jié)束本發(fā)送任務(wù),否則返回第一單元。
優(yōu)選的,所述入隊模塊具體用于將數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊待發(fā)送數(shù)據(jù)的狀態(tài)設(shè)置為第一個狀態(tài),并將待發(fā)送數(shù)據(jù)依次入隊到發(fā)送隊列,并在每入隊一個數(shù)據(jù)后,移動當(dāng)前新數(shù)據(jù)入隊指針到發(fā)送隊列中存放數(shù)據(jù)的下一個位置,直至將本次待發(fā)送數(shù)據(jù)入隊完成,喚醒第一個狀態(tài)發(fā)送任務(wù)。
優(yōu)選的,所述第一個狀態(tài)發(fā)送任務(wù)模塊具體用于在被喚醒后,記錄發(fā)送隊列當(dāng)前新數(shù)據(jù)入隊指針的位置,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始發(fā)送,每發(fā)送一個數(shù)據(jù), 將所述第一個狀態(tài)指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置,判斷所述第一個狀態(tài)指針與所述記錄的當(dāng)前新數(shù)據(jù)入隊指針的位置是否相同,如果不相同,則繼續(xù)發(fā)送當(dāng)前第一個狀態(tài)指針指向的數(shù)據(jù),如果相同則完成本次發(fā)送任務(wù)。
優(yōu)選的,所述接收任務(wù)模塊具體用于接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),根據(jù)該交互指令數(shù)據(jù)中攜帶的數(shù)據(jù)編號確定該交互指令所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù),在所述發(fā)送數(shù)據(jù)中記錄返回該交互指令數(shù)據(jù)的數(shù)據(jù)接收部件標記,并根據(jù)所述已發(fā)送數(shù)據(jù)中攜帶的目的數(shù)據(jù)接收部件信息,判斷當(dāng)前是否收到所述已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),如果是則根據(jù)所述已發(fā)送數(shù)據(jù)的當(dāng)前狀態(tài)m-1,判斷需進入第m個狀態(tài),將所述已發(fā)送數(shù)據(jù)的狀態(tài)更新為第m個狀態(tài),并喚醒第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程,否則繼續(xù)接收該已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù)。
與現(xiàn)有技術(shù)相比,本發(fā)明實質(zhì)上采用了一種新的發(fā)送隊列技術(shù)機制,可以在已有的標準發(fā)送隊列機制上應(yīng)用巧妙的隊列處理方式實現(xiàn)發(fā)送具有狀態(tài)機、并需要順序處理的數(shù)據(jù),同時本發(fā)明又不需要增添新的非隊列技術(shù)之外的新模塊,從而減小增加新模塊來發(fā)送具有狀態(tài)機、并需要順序處理的數(shù)據(jù)的開銷,減小發(fā)送設(shè)備的復(fù)雜度和成本,提高設(shè)備的工作效率,提高設(shè)備的可維護性。
總之,本發(fā)明提高了發(fā)送帶狀態(tài)機數(shù)據(jù)的效率,實現(xiàn)方法簡單,尤其符合嵌入式設(shè)備應(yīng)用特點,適合嵌入式發(fā)送設(shè)備使用。
圖I為本發(fā)明所述數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送方法的一種流程圖2所示為所述第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程圖3為在本發(fā)明一種實施例中所假設(shè)的數(shù)據(jù)報文的狀態(tài)機示意圖4為本發(fā)明所述實施例中SEND_N0_ACK狀態(tài)對應(yīng)的發(fā)送任務(wù)的發(fā)送流程圖5為本發(fā)明所述實施例中SEND_0K狀態(tài)對應(yīng)發(fā)送任務(wù)的發(fā)送流程圖6為本發(fā)明所述數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送裝置的一種組成示意圖。
具體實施方式
下面結(jié)合附圖及具體實施例對本發(fā)明再作進一步詳細的說明
圖I為本發(fā)明所述數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送方法的一種流程圖。本發(fā)明的方法應(yīng)用于分布式的網(wǎng)絡(luò)通信設(shè)備中,該方法中數(shù)據(jù)發(fā)送部件和數(shù)據(jù)接收部件間的數(shù)據(jù)發(fā)送交互流程的狀態(tài)機包括η個狀態(tài),η為大于等于2的正整數(shù),即這種數(shù)據(jù)包括至少2個狀態(tài)。
參見圖I,該方法包括
101、創(chuàng)建發(fā)送隊列,設(shè)置和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)指針以及當(dāng)前新數(shù)據(jù)入隊指針,并將所述指針初始化為指向發(fā)送隊列的第一個數(shù)據(jù)。
所述初始化,一般是指將所述各指針的初始值指向最初入隊的數(shù)據(jù)位置。例如當(dāng)隊列以數(shù)組結(jié)構(gòu)組織時,一般初始入隊的數(shù)據(jù)的序號被標記為0,則所述指針也初始化為 O。
102、創(chuàng)建和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)發(fā)送任務(wù)。
103、創(chuàng)建用于接收來自數(shù)據(jù)接收部件的交互指令數(shù)據(jù)的接收任務(wù)。
104、數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊有數(shù)據(jù)要發(fā)送時,將待發(fā)送的數(shù)據(jù)入隊到所述發(fā)送隊列,并喚醒第一個狀態(tài)發(fā)送任務(wù)。
在一種實施例中,所述步驟104中,數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊有數(shù)據(jù)要發(fā)送時,將待發(fā)送的數(shù)據(jù)入隊到所述發(fā)送隊列的具體方法包括將數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊待發(fā)送數(shù)據(jù)的狀態(tài)設(shè)置為第一個狀態(tài),并將待發(fā)送數(shù)據(jù)依次入隊到發(fā)送隊列,并在每入隊一個數(shù)據(jù)后,移動當(dāng)前新數(shù)據(jù)入隊指針到發(fā)送隊列中存放數(shù)據(jù)的下一個位置,直至將本次待發(fā)送數(shù)據(jù)入隊完成。
105、第一個狀態(tài)發(fā)送任務(wù)在被應(yīng)用程序模塊喚醒后,記錄當(dāng)前新數(shù)據(jù)入隊指針, 從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始遍歷,到記錄的當(dāng)前新數(shù)據(jù)入隊指針指向的數(shù)據(jù)的前一個數(shù)據(jù)遍歷結(jié)束,依次發(fā)送遍歷的數(shù)據(jù)到數(shù)據(jù)接收部件。
在一種實施例中,所述步驟105的具體實現(xiàn)方法包括第一個狀態(tài)發(fā)送任務(wù)在被喚醒后,記錄發(fā)送隊列當(dāng)前新數(shù)據(jù)入隊指針的位置,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始發(fā)送,每發(fā)送一個數(shù)據(jù),將所述第一個狀態(tài)指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置,判斷所述第一個狀態(tài)指針與所述記錄的當(dāng)前新數(shù)據(jù)入隊指針的位置是否相同,如果不相同,則繼續(xù)發(fā)送當(dāng)前第一個狀態(tài)指針指向的數(shù)據(jù),如果相同則完成本次發(fā)送任務(wù)。
106、接收任務(wù)接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),確定該交互指令數(shù)據(jù)所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù)及需進入的下一個狀態(tài)后,本文中將該下一個狀態(tài)表述為第m個狀態(tài),將所述已發(fā)送數(shù)據(jù)的狀態(tài)更新為第m個狀態(tài),并喚醒第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程。
107、執(zhí)行第m個狀態(tài)發(fā)送任務(wù)。
圖2所示為所述第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程圖;其中m為大于等于2、小于等于η的正整數(shù),參見圖2,所述第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程包括如下步驟
201、將發(fā)送隊列中的第m個狀態(tài)指針指向的已發(fā)送數(shù)據(jù)作為當(dāng)前數(shù)據(jù)。
202、判斷當(dāng)前數(shù)據(jù)的狀態(tài)是否為第m個狀態(tài),如果是則執(zhí)行下一步驟,否則結(jié)束本發(fā)送流程。
203、發(fā)送當(dāng)前數(shù)據(jù)的第m個狀態(tài)對應(yīng)需發(fā)送的交互指令數(shù)據(jù),將所述第m個狀態(tài)的指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置。
204、判斷該第m個狀態(tài)是否為最后一個狀態(tài),如果是則進一步將當(dāng)前數(shù)據(jù)移出所述隊列,結(jié)束本流程;否則執(zhí)行下一步驟。
205、判斷第m個狀態(tài)指針與第m_l個狀態(tài)指針所指的位置是否相同,如果是則結(jié)束本發(fā)送流程,否則返回步驟201。
通過上述步驟,對于交互數(shù)據(jù)的每一個狀態(tài),只有收到該狀態(tài)的交互指令數(shù)據(jù)才會觸發(fā)下一狀態(tài)的發(fā)送流程(如步驟203所述),因此保證了數(shù)據(jù)交互狀態(tài)機的順序執(zhí)行。而通過上述步驟201至205,就可以從第m個狀態(tài)指針的開始位置,向第m_l個狀態(tài)指針所指的位置方向,逐個遍歷其間的每個數(shù)據(jù),發(fā)送每個數(shù)據(jù)的第m個狀態(tài)對應(yīng)需發(fā)送的交互指令數(shù)據(jù),從而可以實現(xiàn)能夠在發(fā)送數(shù)據(jù)具有狀態(tài)機及要求發(fā)送不能亂序的情況下,可以直接在本發(fā)明的發(fā)送機制中完成數(shù)據(jù)發(fā)送,減小增加新模塊來解決該需求的開銷,提高設(shè)備的工作效率,提高軟件的可維護性。
在一種實施例中,本步驟106中,所述接收任務(wù)接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),確定該交互指令數(shù)據(jù)所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù)及需進入的第m個狀態(tài)的具體方法為接收任務(wù)接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),該交互指令數(shù)據(jù)中包含其對應(yīng)的已發(fā)送數(shù)據(jù)的數(shù)據(jù)編號,之后根據(jù)該交互指令數(shù)據(jù)中攜帶的數(shù)據(jù)編號確定該交互指令所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù),在所述發(fā)送數(shù)據(jù)中記錄返回該交互指令數(shù)據(jù)的數(shù)據(jù)接收部件標記,并根據(jù)所述已發(fā)送數(shù)據(jù)中攜帶的目的數(shù)據(jù)接收部件信息,判斷當(dāng)前是否收到所述已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),如果是則根據(jù)所述已發(fā)送數(shù)據(jù)的當(dāng)前狀態(tài),假設(shè)為第m-Ι個狀態(tài),判斷需進入下一個狀態(tài)即第m個狀態(tài), 然后執(zhí)行后續(xù)的流程即將所述已發(fā)送數(shù)據(jù)的狀態(tài)更新為第m個狀態(tài),并喚醒第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程,否則繼續(xù)接收該已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù)。
通過上述處理,只有待發(fā)送數(shù)據(jù)所關(guān)心的所有目的分布式部件返回交互指令數(shù)據(jù)后才會觸發(fā)下一個狀態(tài)的發(fā)送流程。因此可以在各個分布式部件返回交互指令數(shù)據(jù)的速度各不一樣時,也能保證待發(fā)送數(shù)據(jù)順序處理和狀態(tài)的變化。
在一種實施例中,步驟106中,所述記錄返回交互指令數(shù)據(jù)的數(shù)據(jù)接收部件標記, 具體包括用位圖表征每個已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件是否返回交互指令數(shù)據(jù), 在收到一個目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù)后,在對應(yīng)已發(fā)送數(shù)據(jù)中將返回交互指令數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖對應(yīng)的比特位置I ;
所述已發(fā)送數(shù)據(jù)中攜帶的目的數(shù)據(jù)接收部件信息,是指應(yīng)用程序模塊在將已發(fā)送數(shù)據(jù)入隊到發(fā)送隊列之前,在已發(fā)送數(shù)據(jù)中用位圖表征該發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件,將需要接收該已發(fā)送數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖對應(yīng)的比特位置I ;
所述判斷當(dāng)前是否收到所述已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),具體包括判斷該已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件位圖是否和返回交互指令數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖相同,如果相同則判定收到該已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),否則判定還沒有收到該已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù)。
下面以一個具體的具有狀態(tài)機,且需要順序發(fā)送的數(shù)據(jù)報文的發(fā)送方法為具體實施例,對本發(fā)明做進一步的說明。
在該具體實施例中,所述的數(shù)據(jù)發(fā)送部件為所述分布式網(wǎng)絡(luò)通信設(shè)備的主控卡, 所述數(shù)據(jù)接收部件為所述分布式網(wǎng)絡(luò)通信設(shè)備的線卡。圖3為在該實施例中所假設(shè)的數(shù)據(jù)交互(下面簡稱數(shù)據(jù))的狀態(tài)機示意圖。參見圖3,該數(shù)據(jù)具有3個狀態(tài),分別是初始化狀態(tài)(INIT,第I個狀態(tài))、發(fā)送未確認狀態(tài)(SEND_N0_ACK,第2個狀態(tài))、發(fā)送完成狀態(tài)(SEND_0K, 第3個狀態(tài))。
首先,需要創(chuàng)建一個發(fā)送隊列,定義長度為1024,并設(shè)置3個狀態(tài)指針plnit、 pSendNoAck和pSendOk,以及設(shè)置當(dāng)前新數(shù)據(jù)入隊指針pCurrent。所述plnit為第I個狀態(tài)指針;所述pSendNoAck為第2個狀態(tài)指針,所述pSendOk為第3個狀態(tài)的指針,所述各個指針全都初始化為O。
其次,需要在程序中創(chuàng)建并運行和所述狀態(tài)機的各狀態(tài)以及3個狀態(tài)指針分別對應(yīng)的3個狀態(tài)發(fā)送任務(wù);還要創(chuàng)建用于接收來自數(shù)據(jù)接收部件的交互指令數(shù)據(jù)的接收任務(wù)。數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊有數(shù)據(jù)要發(fā)送時,將待發(fā)送的數(shù)據(jù)入隊到所述發(fā)送隊列, 當(dāng)應(yīng)用程序模塊每入隊一個數(shù)據(jù)到發(fā)送隊列中有新數(shù)據(jù)入隊時,則設(shè)置該新入隊數(shù)據(jù)的狀態(tài)為INIT,并將所述當(dāng)前新數(shù)據(jù)入隊指針pCurrentinit移到發(fā)送隊列的下一個位置;應(yīng)用程序模塊將本次待發(fā)數(shù)據(jù)入隊完成后,并喚醒第一個狀態(tài)發(fā)送任務(wù)。當(dāng)隊列是以數(shù)組結(jié)構(gòu)組織時,其中第一個新數(shù)據(jù)入隊的方式是從數(shù)組隊列下標O開始入隊,并且給入隊的數(shù)據(jù)成員標上序列號,當(dāng)序列號為1024時又從數(shù)組隊列下標O開始入,如此往復(fù),并且第I個隊列狀態(tài)指針和當(dāng)前最新入隊的指針是和序列號相對應(yīng)的,其中所述pCurrent指針指向新入隊數(shù)據(jù)的位置,例如新入隊數(shù)據(jù)的下標為4,則pCurrent指針也為4。
當(dāng)?shù)谝粋€狀態(tài)發(fā)送任務(wù)被喚醒后,記錄當(dāng)前新數(shù)據(jù)入隊指針pCurrent,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始遍歷(第一次被喚醒時指向下標O所在的數(shù)據(jù)),到記錄的當(dāng)前新數(shù)據(jù)入隊指針指向的數(shù)據(jù)的前一個數(shù)據(jù)遍歷結(jié)束,依次發(fā)送遍歷的數(shù)據(jù)到數(shù)據(jù)接收部件。第一個狀態(tài)發(fā)送任務(wù)每發(fā)送一個數(shù)據(jù),將對應(yīng)的第一個狀態(tài)指針Plnit移動到發(fā)送隊列中存放待發(fā)送數(shù)據(jù)的下一個位置。
然后,接收任務(wù)接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),確定該交互指令數(shù)據(jù)所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù)及需進入的下一個狀態(tài)即第m個狀態(tài)后,將所述已發(fā)送數(shù)據(jù)的狀態(tài)更新為第m個狀態(tài),并喚醒第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程。
具體的,當(dāng)接收任務(wù)判斷當(dāng)前接收的所有目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù)對應(yīng)的已發(fā)送數(shù)據(jù)的當(dāng)前狀態(tài)為INIT狀態(tài),則需進入第二個狀態(tài)即所述SEND_N0_ACK狀態(tài),此時需要將該已發(fā)送數(shù)據(jù)的狀態(tài)更新為SEND_N0_ACK狀態(tài),喚醒SEND_N0_ACK狀態(tài)的對應(yīng)的發(fā)送任務(wù)。
圖4為本發(fā)明所述實施例中SEND_N0_ACK狀態(tài)對應(yīng)的發(fā)送任務(wù)的發(fā)送流程圖。參見圖4,該流程包括
401、將發(fā)送隊列中的psendNoAck狀態(tài)指針指向的已發(fā)送數(shù)據(jù)作為當(dāng)前數(shù)據(jù);
402、判斷當(dāng)前數(shù)據(jù)的狀態(tài)是否為SEND_N0_ACK狀態(tài),如果是則執(zhí)行下一步驟,否則結(jié)束本發(fā)送流程;
403、發(fā)送當(dāng)前數(shù)據(jù)的SEND_N0_ACK狀態(tài)對應(yīng)需發(fā)送的交互指令數(shù)據(jù)到目的接收部件,將對應(yīng)的psendNoAck狀態(tài)指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置;
404、判定該SEND_N0_ACK狀態(tài)不是最后一個狀態(tài),執(zhí)行下一步驟。
405、判斷psendNoAck狀態(tài)指針與pinit狀態(tài)指針所指的位置是否相同,如果是則結(jié)束本發(fā)送流程,否則返回步驟401。
如果接收任務(wù)判斷當(dāng)前接收的所有目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù)對應(yīng)的已發(fā)送數(shù)據(jù)的當(dāng)前狀態(tài)為SEND_N0_ACK狀態(tài),則需進入第3個狀態(tài)即所述SEND OK狀態(tài), 此時接收任務(wù)需要將該已發(fā)送數(shù)據(jù)的狀態(tài)更新為SEND_0K狀態(tài),喚醒SEND_0K狀態(tài)的對應(yīng)的發(fā)送任務(wù)。
圖5為本發(fā)明所述實施例中SEND_0K狀態(tài)對應(yīng)發(fā)送任務(wù)的發(fā)送流程圖。參見圖5, 該流程包括
501、將發(fā)送隊列中的psendOK狀態(tài)指針指向的已發(fā)送數(shù)據(jù)作為當(dāng)前數(shù)據(jù);
502、判斷當(dāng)前數(shù)據(jù)的狀態(tài)是否為SEND_0K狀態(tài),如果是則執(zhí)行下一步驟,否則結(jié)束本發(fā)送流程;
503、發(fā)送當(dāng)前數(shù)據(jù)的SEND_0K狀態(tài)對應(yīng)需發(fā)送的交互指令數(shù)據(jù),并將psendOK狀態(tài)指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置;
504、判定SEND_0K狀態(tài)為最后一個狀態(tài),將當(dāng)前數(shù)據(jù)移出所述隊列,結(jié)束本流程。
通過上述步驟,可以實現(xiàn)能夠在發(fā)送數(shù)據(jù)具有狀態(tài)機及要求發(fā)送不能亂序的情況下,可以直接在發(fā)送機制中完成數(shù)據(jù)發(fā)送,減小增加新模塊來解決該需求的開銷,提高設(shè)備的工作效率,提高軟件的可維護性。
與本發(fā)明所述的方法對應(yīng),本發(fā)明還公開了一種數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送裝置。應(yīng)用于分布式的網(wǎng)絡(luò)通信設(shè)備中的數(shù)據(jù)發(fā)送部件中,所述數(shù)據(jù)發(fā)送部件和對應(yīng)的數(shù)據(jù)接收部件間的數(shù)據(jù)發(fā)送交互流程的狀態(tài)機包括η個狀態(tài),η為大于等于2的正整數(shù)。圖6為本發(fā)明所述數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送裝置的一種組成示意圖;參見圖6,該裝置包括
發(fā)送隊列創(chuàng)建模塊601,用于設(shè)置和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)指針以及當(dāng)前新數(shù)據(jù)入隊指針,并將所述指針初始化為指向發(fā)送隊列的第一個數(shù)據(jù);
發(fā)送任務(wù)創(chuàng)建模塊602,用于創(chuàng)建和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)發(fā)送任務(wù)模塊;
接收任務(wù)創(chuàng)建模塊603,用于創(chuàng)建用于接收來自數(shù)據(jù)接收部件的交互指令數(shù)據(jù)的接收任務(wù)模塊;
入隊模塊604,用于在數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊有數(shù)據(jù)要發(fā)送時,將待發(fā)送的數(shù)據(jù)入隊到所述發(fā)送隊列,并喚醒第一個狀態(tài)發(fā)送任務(wù)模塊605 ;
第一個狀態(tài)發(fā)送任務(wù)模塊605,用于在被喚醒后,記錄當(dāng)前新數(shù)據(jù)入隊指針,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始遍歷,到記錄的當(dāng)前新數(shù)據(jù)入隊指針指向的數(shù)據(jù)的前一個數(shù)據(jù)遍歷結(jié)束,依次發(fā)送遍歷的數(shù)據(jù)到數(shù)據(jù)接收部件;
接收任務(wù)模塊606,用于接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),確定該交互指令數(shù)據(jù)所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù)及需進入的下一個狀態(tài)即第m個狀態(tài)后,將所述已發(fā)送數(shù)據(jù)的狀態(tài)更新為第m個狀態(tài),并喚醒第m個狀態(tài)發(fā)送任務(wù)模塊,所述m為大于等于2、小于等于η的正整數(shù);
本發(fā)明的發(fā)送裝置還包括m個狀態(tài)發(fā)送任務(wù)模塊,其中,所述第m個狀態(tài)發(fā)送任務(wù)模塊包括如下單元,
第一單元,用于將發(fā)送隊列中的第m個狀態(tài)指針指向的已發(fā)送數(shù)據(jù)作為當(dāng)前數(shù)據(jù);
第二單元,用于判斷當(dāng)前數(shù)據(jù)的狀態(tài)是否為第m個狀態(tài),如果是則執(zhí)行下一單元, 否則結(jié)束本發(fā)送任務(wù);
第三單元,用于發(fā)送當(dāng)前數(shù)據(jù)的第m個狀態(tài)對應(yīng)需發(fā)送的交互指令數(shù)據(jù),將所述第m個狀態(tài)的指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置;
第四單元,用于判斷該第m個狀態(tài)是否為最后一個狀態(tài),是則進一步將當(dāng)前數(shù)據(jù)移出所述隊列,結(jié)束本發(fā)送任務(wù),否則執(zhí)行下一單元;
第五單元,用于判斷第m個狀態(tài)指針與第m-ι個狀態(tài)指針所指的位置是否相同,如果是則結(jié)束本發(fā)送任務(wù),否則返回第一單元。
在一種實施例中,所述入隊模塊604具體用于將數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊待發(fā)送數(shù)據(jù)的狀態(tài)設(shè)置為第一個狀態(tài),并將待發(fā)送數(shù)據(jù)依次入隊到發(fā)送隊列,并在每入隊一個數(shù)據(jù)后,移動當(dāng)前新數(shù)據(jù)入隊指針到發(fā)送隊列中存放數(shù)據(jù)的下一個位置,直至將本次待發(fā)送數(shù)據(jù)入隊完成,喚醒第一個狀態(tài)發(fā)送任務(wù)。
在另一種實施例中,所述第一個狀態(tài)發(fā)送任務(wù)模塊605具體用于在被喚醒后,記錄發(fā)送隊列當(dāng)前新數(shù)據(jù)入隊指針的位置,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始發(fā)送, 每發(fā)送一個數(shù)據(jù),將所述第一個狀態(tài)指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置,判斷所述第一個狀態(tài)指針與所述記錄的當(dāng)前新數(shù)據(jù)入隊指針的位置是否相同,如果不相同,則繼續(xù)發(fā)送當(dāng)前第一個狀態(tài)指針指向的數(shù)據(jù),如果相同則完成本次發(fā)送任務(wù)。
在另一種實施例中,所述接收任務(wù)模塊606具體用于接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),根據(jù)該交互指令數(shù)據(jù)中攜帶的數(shù)據(jù)編號確定該交互指令所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù),在所述發(fā)送數(shù)據(jù)中記錄返回該交互指令數(shù)據(jù)的數(shù)據(jù)接收部件標記, 并根據(jù)所述已發(fā)送數(shù)據(jù)中攜帶的目的數(shù)據(jù)接收部件信息,判斷當(dāng)前是否收到所述已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),如果是則根據(jù)所述已發(fā)送數(shù)據(jù)的當(dāng)前狀態(tài)m-Ι,判斷需進入第m個狀態(tài),將所述已發(fā)送數(shù)據(jù)的狀態(tài)更新為第m個狀態(tài),并喚醒第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程,否則繼續(xù)接收該已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù)。
在所述接收任務(wù)模塊606的運行過程中,所述記錄返回該交互指令數(shù)據(jù)的數(shù)據(jù)接收部件標記,具體包括用位圖表征每個已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件是否返回交互指令數(shù)據(jù),在收到一個目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù)后,在對應(yīng)已發(fā)送數(shù)據(jù)中將返回交互指令數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖對應(yīng)的比特位置I ;
所述已發(fā)送數(shù)據(jù)中攜帶的目的數(shù)據(jù)接收部件信息,是指應(yīng)用程序模塊在將已發(fā)送數(shù)據(jù)入隊到發(fā)送隊列之前,在已發(fā)送數(shù)據(jù)中用位圖表征該發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件,將需要接收該已發(fā)送數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖對應(yīng)的比特位置I ;
所述判斷當(dāng)前是否收到所述已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),具體包括判斷該已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件位圖是否和返回交互指令數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖相同,如果相同則判定收到該已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),否則判定還沒有收到該已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù)。
在一種實施例中,所述的數(shù)據(jù)發(fā)送部件為所述分布式網(wǎng)絡(luò)通信設(shè)備的主控卡,所述數(shù)據(jù)接收部件為所述分布式網(wǎng)絡(luò)通信設(shè)備的線卡。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明保護的范圍之內(nèi)。
權(quán)利要求
1.一種數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送方法,應(yīng)用于分布式的網(wǎng)絡(luò)通信設(shè)備中,其特征在于,該方法中數(shù)據(jù)發(fā)送部件和數(shù)據(jù)接收部件間的數(shù)據(jù)發(fā)送交互流程的狀態(tài)機包括η個狀態(tài),η為大于等于2的正整數(shù);該方法包括 創(chuàng)建發(fā)送隊列,設(shè)置和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)指針以及當(dāng)前新數(shù)據(jù)入隊指針,并將所述指針初始化為指向發(fā)送隊列的第一個數(shù)據(jù); 創(chuàng)建和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)發(fā)送任務(wù); 創(chuàng)建用于接收來自數(shù)據(jù)接收部件的交互指令數(shù)據(jù)的接收任務(wù); 數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊有數(shù)據(jù)要發(fā)送時,將待發(fā)送的數(shù)據(jù)入隊到所述發(fā)送隊列,并喚醒第一個狀態(tài)發(fā)送任務(wù); 第一個狀態(tài)發(fā)送任務(wù)在被喚醒后,記錄當(dāng)前新數(shù)據(jù)入隊指針,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始遍歷,到記錄的當(dāng)前新數(shù)據(jù)入隊指針指向的數(shù)據(jù)的前一個數(shù)據(jù)遍歷結(jié)束,依次發(fā)送遍歷的數(shù)據(jù)到數(shù)據(jù)接收部件; 接收任務(wù)接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),確定該交互指令數(shù)據(jù)所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù)及需進入的下一個狀態(tài)即第m個狀態(tài)后,將所述已發(fā)送數(shù)據(jù)的狀態(tài)更新為第m個狀態(tài),并喚醒第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程; 其中,所述第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程包括如下步驟,m為大于等于2、小于等于η的正整數(shù) Α、將發(fā)送隊列中的第m個狀態(tài)指針指向的已發(fā)送數(shù)據(jù)作為當(dāng)前數(shù)據(jù); B、判斷當(dāng)前數(shù)據(jù)的狀態(tài)是否為第m個狀態(tài),如果是則執(zhí)行下一步驟,否則結(jié)束本發(fā)送流程; C、發(fā)送當(dāng)前數(shù)據(jù)的第m個狀態(tài)對應(yīng)需發(fā)送的交互指令數(shù)據(jù),將所述第m個狀態(tài)的指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置; D、判斷該第m個狀態(tài)是否為最后一個狀態(tài),如果是則進一步將當(dāng)前數(shù)據(jù)移出所述隊列,結(jié)束本流程;否則執(zhí)行下一步驟; E、判斷第m個狀態(tài)指針與第m-Ι個狀態(tài)指針所指的位置是否相同,如果是則結(jié)束本發(fā)送流程,否則返回步驟A。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于,數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊有數(shù)據(jù)要發(fā)送時,將待發(fā)送的數(shù)據(jù)入隊到所述發(fā)送隊列的具體方法為 將數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊待發(fā)送數(shù)據(jù)的狀態(tài)設(shè)置為第一個狀態(tài),并將待發(fā)送數(shù)據(jù)依次入隊到發(fā)送隊列,并在每入隊一個數(shù)據(jù)后,移動當(dāng)前新數(shù)據(jù)入隊指針到發(fā)送隊列中存放數(shù)據(jù)的下一個位置,直至將本次待發(fā)送數(shù)據(jù)入隊完成。
3.根據(jù)權(quán)利要求I所述的方法,其特征在于,第一個狀態(tài)發(fā)送任務(wù)在被喚醒后,記錄當(dāng)前新數(shù)據(jù)入隊指針,從第一個狀態(tài)指當(dāng)前針所指向的數(shù)據(jù)開始遍歷,到記錄的當(dāng)前新數(shù)據(jù)入隊指針指向的數(shù)據(jù)的前一個數(shù)據(jù)遍歷結(jié)束,依次發(fā)送遍歷的數(shù)據(jù)到數(shù)據(jù)接收部件,具體包括 第一個狀態(tài)發(fā)送任務(wù)在被喚醒后,記錄發(fā)送隊列當(dāng)前新數(shù)據(jù)入隊指針的位置,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始發(fā)送,每發(fā)送一個數(shù)據(jù),將所述第一個狀態(tài)指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置,判斷所述第一個狀態(tài)指針與所述記錄的當(dāng)前新數(shù)據(jù)入隊指針的位置是否相同,如果不相同,則繼續(xù)發(fā)送當(dāng)前第一個狀態(tài)指針指向的數(shù)據(jù),如果相同則完成本次發(fā)送任務(wù)。
4.根據(jù)權(quán)利要求I所述的方法,其特征在于,接收任務(wù)接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),確定該交互指令數(shù)據(jù)所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù)及需進入的第m個狀態(tài)的具體方法為 接收任務(wù)接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),根據(jù)該交互指令數(shù)據(jù)中攜帶的數(shù)據(jù)編號確定該交互指令所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù),在所述發(fā)送數(shù)據(jù)中記錄返回該交互指令數(shù)據(jù)的數(shù)據(jù)接收部件標記,并根據(jù)所述已發(fā)送數(shù)據(jù)中攜帶的目的數(shù)據(jù)接收部件信息,判斷當(dāng)前是否收到所述已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),如果是則根據(jù)所述已發(fā)送數(shù)據(jù)的當(dāng)前狀態(tài)即第m-Ι狀態(tài),判斷需進入下一狀態(tài)即第m個狀態(tài),執(zhí)行后續(xù)的流程,否則繼續(xù)接收該已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù)。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于, 所述記錄返回該交互指令數(shù)據(jù)的數(shù)據(jù)接收部件標記,具體包括用位圖表征每個已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件是否返回交互指令數(shù)據(jù),在收到一個目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù)后,在對應(yīng)已發(fā)送數(shù)據(jù)中將返回交互指令數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖對應(yīng)的比特位置I ; 所述已發(fā)送數(shù)據(jù)中攜帶的目的數(shù)據(jù)接收部件信息,是指應(yīng)用程序模塊在將已發(fā)送數(shù)據(jù)入隊到發(fā)送隊列之前,在已發(fā)送數(shù)據(jù)中用位圖表征該發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件,將需要接收該已發(fā)送數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖對應(yīng)的比特位置I ; 所述判斷當(dāng)前是否收到所述已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),具體包括判斷該已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件位圖是否和返回交互指令數(shù)據(jù)的目的數(shù)據(jù)接收部件位圖相同,如果相同則判定收到該已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),否則判定還沒有收到該已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù)。
6.根據(jù)權(quán)利要求I至5任一項所述的方法,其特征在于,所述的數(shù)據(jù)發(fā)送部件為所述分布式網(wǎng)絡(luò)通信設(shè)備的主控卡,所述數(shù)據(jù)接收部件為所述分布式網(wǎng)絡(luò)通信設(shè)備的線卡。
7.一種數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送裝置,應(yīng)用于分布式的網(wǎng)絡(luò)通信設(shè)備中的數(shù)據(jù)發(fā)送部件中,其特征在于,所述數(shù)據(jù)發(fā)送部件和對應(yīng)的數(shù)據(jù)接收部件間的數(shù)據(jù)發(fā)送交互流程的狀態(tài)機包括η個狀態(tài),η為大于等于2的正整數(shù);該裝置包括 發(fā)送隊列創(chuàng)建模塊,用于設(shè)置和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)指針以及當(dāng)前新數(shù)據(jù)入隊指針,并將所述指針初始化為指向發(fā)送隊列的第一個數(shù)據(jù); 發(fā)送任務(wù)創(chuàng)建模塊,用于創(chuàng)建和所述狀態(tài)機的各狀態(tài)分別對應(yīng)的η個狀態(tài)發(fā)送任務(wù)模塊; 接收任務(wù)創(chuàng)建模塊,用于創(chuàng)建用于接收來自數(shù)據(jù)接收部件的交互指令數(shù)據(jù)的接收任務(wù)模塊; 入隊模塊,用于在數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊有數(shù)據(jù)要發(fā)送時,將待發(fā)送的數(shù)據(jù)入隊到所述發(fā)送隊列,并喚醒第一個狀態(tài)發(fā)送任務(wù)模塊; 第一個狀態(tài)發(fā)送任務(wù)模塊,用于在被喚醒后,記錄當(dāng)前新數(shù)據(jù)入隊指針,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始遍歷,到記錄的當(dāng)前新數(shù)據(jù)入隊指針指向的數(shù)據(jù)的前一個數(shù)據(jù)遍歷結(jié)束,依次發(fā)送遍歷的數(shù)據(jù)到數(shù)據(jù)接收部件; 接收任務(wù)模塊,用于接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),確定該交互指令數(shù)據(jù)所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù)及需進入的下一個狀態(tài)即第m個狀態(tài)后,將所述已發(fā)送數(shù)據(jù)的狀態(tài)更新為第m個狀態(tài),并喚醒第m個狀態(tài)發(fā)送任務(wù)模塊,所述m為大于等于2、小于等于η的正整數(shù); m個狀態(tài)發(fā)送任務(wù)模塊,其中,第m個狀態(tài)發(fā)送任務(wù)模塊包括如下單元, 第一單元,用于將發(fā)送隊列中的第m個狀態(tài)指針指向的已發(fā)送數(shù)據(jù)作為當(dāng)前數(shù)據(jù);第二單元,用于判斷當(dāng)前數(shù)據(jù)的狀態(tài)是否為第m個狀態(tài),如果是則執(zhí)行下一單元,否則結(jié)束本發(fā)送任務(wù); 第三單元,用于發(fā)送當(dāng)前數(shù)據(jù)的第m個狀態(tài)對應(yīng)需發(fā)送的交互指令數(shù)據(jù),將所述第m個狀態(tài)的指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置; 第四單元,用于判斷該第m個狀態(tài)是否為最后一個狀態(tài),是則進一步將當(dāng)前數(shù)據(jù)移出所述隊列,結(jié)束本發(fā)送任務(wù),否則執(zhí)行下一單元; 第五單元,用于判斷第m個狀態(tài)指針與第m-Ι個狀態(tài)指針所指的位置是否相同,如果是則結(jié)束本發(fā)送任務(wù),否則返回第一單元。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述入隊模塊具體用于 將數(shù)據(jù)發(fā)送部件的應(yīng)用程序模塊待發(fā)送數(shù)據(jù)的狀態(tài)設(shè)置為第一個狀態(tài),并將待發(fā)送數(shù)據(jù)依次入隊到發(fā)送隊列,并在每入隊一個數(shù)據(jù)后,移動當(dāng)前新數(shù)據(jù)入隊指針到發(fā)送隊列中存放數(shù)據(jù)的下一個位置,直至將本次待發(fā)送數(shù)據(jù)入隊完成,喚醒第一個狀態(tài)發(fā)送任務(wù)。
9.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述第一個狀態(tài)發(fā)送任務(wù)模塊具體用于 在被喚醒后,記錄發(fā)送隊列當(dāng)前新數(shù)據(jù)入隊指針的位置,從第一個狀態(tài)指針當(dāng)前所指向的數(shù)據(jù)開始發(fā)送,每發(fā)送一個數(shù)據(jù),將所述第一個狀態(tài)指針指向發(fā)送隊列中存放數(shù)據(jù)的下一個位置,判斷所述第一個狀態(tài)指針與所述記錄的當(dāng)前新數(shù)據(jù)入隊指針的位置是否相同,如果不相同,則繼續(xù)發(fā)送當(dāng)前第一個狀態(tài)指針指向的數(shù)據(jù),如果相同則完成本次發(fā)送任務(wù)。
10.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述接收任務(wù)模塊具體用于 接收目的數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù),根據(jù)該交互指令數(shù)據(jù)中攜帶的數(shù)據(jù)編號確定該交互指令所對應(yīng)的發(fā)送隊列中的已發(fā)送數(shù)據(jù),在所述發(fā)送數(shù)據(jù)中記錄返回該交互指令數(shù)據(jù)的數(shù)據(jù)接收部件標記,并根據(jù)所述已發(fā)送數(shù)據(jù)中攜帶的目的數(shù)據(jù)接收部件信息,判斷當(dāng)前是否收到所述已發(fā)送數(shù)據(jù)對應(yīng)的所有目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù),如果是則根據(jù)所述已發(fā)送數(shù)據(jù)的當(dāng)前狀態(tài)m-Ι,判斷需進入第m個狀態(tài),將所述已發(fā)送數(shù)據(jù)的狀態(tài)更新為第m個狀態(tài),并喚醒第m個狀態(tài)發(fā)送任務(wù)對應(yīng)的發(fā)送流程,否則繼續(xù)接收該已發(fā)送數(shù)據(jù)對應(yīng)的目的數(shù)據(jù)接收部件的交互指令數(shù)據(jù)。
全文摘要
本申請公開了一種數(shù)據(jù)通信中的數(shù)據(jù)發(fā)送方法和裝置,應(yīng)用于分布式的網(wǎng)絡(luò)通信設(shè)備中,其中數(shù)據(jù)發(fā)送部件和數(shù)據(jù)接收部件間的數(shù)據(jù)發(fā)送交互流程的狀態(tài)機包括n個狀態(tài);包括創(chuàng)建發(fā)送隊列,設(shè)置各狀態(tài)分別對應(yīng)的n個狀態(tài)指針和當(dāng)前新數(shù)據(jù)入隊指針,將待發(fā)送的數(shù)據(jù)發(fā)入到發(fā)送隊列中,第一個狀態(tài)對應(yīng)的發(fā)送任務(wù)依次發(fā)送數(shù)據(jù),并根據(jù)數(shù)據(jù)接收部件返回的交互指令數(shù)據(jù)確定所需喚醒的下一狀態(tài)對應(yīng)的發(fā)送任務(wù),將數(shù)據(jù)狀態(tài)更新為下一狀態(tài),再喚醒該下一狀態(tài)對應(yīng)的發(fā)送任務(wù)。利用本發(fā)明,既可以發(fā)送具有狀態(tài)機、并需要順序處理的數(shù)據(jù),同時減小發(fā)送設(shè)備的復(fù)雜度和成本,提高設(shè)備的工作效率和可維護性。
文檔編號H04L12/861GK102984086SQ20121049745
公開日2013年3月20日 申請日期2012年11月29日 優(yōu)先權(quán)日2012年11月29日
發(fā)明者梁暉, 萬維威 申請人:邁普通信技術(shù)股份有限公司