[0069] (3)由已連接UDP套接字引發(fā)的異步錯誤會返回給它們所在的進(jìn)程,而未連接的 UDP套接字不接收任何異步錯誤。
[0070] 至此,通過bind系統(tǒng)調(diào)用W及connect系統(tǒng)調(diào)用,已經(jīng)將此scoket套接字五元組P 中的3個部分(Pl協(xié)議,P2源IP地址:源端口,P3目的IP地址:目的端口)進(jìn)行了確定,運(yùn)樣便 可唯一標(biāo)識一個socket套接字,為數(shù)據(jù)報路由到特定的套接字提供了技術(shù)支持。
[0071] 可選地,在步驟S6中,通過臨時UDP套接字讀取從客戶端接收到的數(shù)據(jù)可W包括W 下步驟:
[0072] 步驟S61:獲取與預(yù)設(shè)端口相匹配的全部臨時UDP套接字,并根據(jù)服務(wù)器的標(biāo)識信 息和/或客戶端的標(biāo)識信息選取匹配程度最高的臨時UDP套接字作為上述臨時UDP套接字;
[0073] 步驟S62:在臨時UDP套接字產(chǎn)生讀取信號,并從與臨時UDP套接字相關(guān)聯(lián)的接收緩 沖區(qū)中讀取從客戶端接收到的數(shù)據(jù)。
[0074] 在優(yōu)選實施例中,服務(wù)器端向臨時UDP套接字上發(fā)送的數(shù)據(jù)會由內(nèi)核自動路由到 客戶端所在的端口上;而從客戶端發(fā)送到服務(wù)器的數(shù)據(jù),在服務(wù)器端接收到上述數(shù)據(jù)后,會 由內(nèi)核協(xié)議找自動路由到臨時UDP套接字描述符關(guān)聯(lián)的接收緩沖區(qū),并在臨時UDP套接字上 產(chǎn)生讀取信號。
[0075] 當(dāng)UDP數(shù)據(jù)報進(jìn)入雌?八?協(xié)議找時,內(nèi)核的處理過程如下:
[0076] 數(shù)據(jù)報會由IP層傳入到相應(yīng)的UDP的輸入函數(shù)UDP_INPUT進(jìn)行處理,UDP_INPUT的 目標(biāo)是將UDP數(shù)據(jù)報放置到合適的socket的緩存內(nèi),喚醒該socket上因輸入阻塞的調(diào)用(例 如:selectKUDPJNPUT通過對數(shù)據(jù)報的(源IP地址:源端口,目的IP地址:目的端口)與UDP 中所有socket套接字關(guān)聯(lián)的(本地IP地址:本地端口,外部IP地址:外部端口)進(jìn)行匹配。而 UDP數(shù)據(jù)交付給相應(yīng)socket套接字的規(guī)則如下:
[0077] (1)將目的地為廣播IP地址或多播IP地址的UDP數(shù)據(jù)報交付給所有匹配的插口; [00 7引(2)將目的地是單播IP地址的到達(dá)UDP數(shù)據(jù)報只交付給一個匹配的插口,即具有最 小通配匹配數(shù)的插口。如果存在多個插口具有相同的"最小"通配匹配數(shù),那么具體由哪個 插口來接收到達(dá)數(shù)據(jù)報則依賴于不同的適用場景。
[0079] (3)通常將connect系統(tǒng)調(diào)用與TCP客戶端進(jìn)行關(guān)聯(lián),但是,UDP客戶端或UDP服務(wù)器 也可能調(diào)用connect函數(shù),為socket指定外部IP地址和外部端口號。運(yùn)就限制了 socket必須 只與某個特定對方交換UDP數(shù)據(jù)報。
[0080] 表2示出了本發(fā)明優(yōu)選實施例中UDP插口的本地和外部IP地址和端口規(guī)范。如表2 所示,
[0083] 上述表格中呈現(xiàn)了UDP SCOket的S種不同的狀態(tài),W及函數(shù)為終止各狀態(tài)調(diào)用的 偽代碼. lport"表示本地IP缺省和. 表示外部IP和外部端口均缺省。在優(yōu)選實施例 中所使用的監(jiān)聽套接字即為表2中的第二種狀態(tài)(上述表格中的第=行,即限制在本接口上 到達(dá)的數(shù)據(jù)報),運(yùn)樣就可W接收所有的用戶請求連接。而在接收到請求連接后,新建的套 接字經(jīng)過bind系統(tǒng)調(diào)用W及connect系統(tǒng)調(diào)用后,便會轉(zhuǎn)化為第一種狀態(tài)(上述表格中的第 二行,即限制到一個對方)了。
[0084] 在優(yōu)選實施過程中,可W按照最小通配匹配數(shù)原則選取匹配程度最高的臨時UDP 套接字作為上述臨時UDP套接字。最小通配匹配數(shù)原則是指UDP數(shù)據(jù)報文只會傳遞到具有最 小通配匹配的socket上。
[0085] 表3示出了本發(fā)明優(yōu)選實施例的本地端口是23的S個UDP插口。如表3所示,
[008引在上述表格中,一臺主機(jī)上的S個插口 /V'表示缺省。當(dāng)UDP接收到一個目的端口 為23的報文段時,調(diào)用內(nèi)核函數(shù),捜索整個Internet PCB表(此處提到的Internet PCB表是 內(nèi)核協(xié)議找中一個傳輸層鏈表結(jié)構(gòu),鏈表中的每一項為一個協(xié)議控制塊(PCB),協(xié)議控制塊 用來存放所有UDP端結(jié)點共有的信息:外部和本地IP地址、外部和本地端口、IP首部原型等 其他相關(guān)內(nèi)容。因為UDP是無連接的,一個端結(jié)點需要的所有信息都可W存儲在Internet PCB中)找到一個匹配的PCB結(jié)點。為了確定通配匹配數(shù),在該優(yōu)選實施例中只考慮本地和外 部的IP地址,暫不考慮外部端口號。本地端口號是必須要匹配的,否則數(shù)據(jù)報根本無法路由 到應(yīng)用程序上。通配匹配數(shù)可W是0、1(本地IP地址或外部IP地址)、2(本地和外部IP地址)。
[0089] 表4示出了本發(fā)明優(yōu)選實施例的從{140.252.1.11,1500 :}到{140.252.1.29,23}的 到達(dá)報文段。如表4所示,
[0092] 例如,假定到達(dá)報文段來自140.252.1.11,端口 1500,目的地是140.252.1.29,端 口 23,V'表示缺省。當(dāng)與上述表格中的第二行比較時,外部地址通配匹配,其通配匹配數(shù)為 1;當(dāng)與上述表格中的第=行比較時,本地地址和外部地址通配匹配,其通配匹配數(shù)為2;當(dāng) 與上述表格中的最后一行比較時,發(fā)現(xiàn)本地地址、外部地址W及外部端口完全匹配,其通配 匹配數(shù)為0。利用最小通配匹配的原則,此報文段會傳遞到最后一行所對應(yīng)的socket接口 上,由此掲示了客戶端發(fā)送給服務(wù)器的數(shù)據(jù)會正確地投遞到其所關(guān)聯(lián)的socket套接字上的 技術(shù)原理。
[0093] 下面將結(jié)合圖3所示的優(yōu)選實施方式對上述優(yōu)選實施過程作進(jìn)一步地描述。
[0094]圖3是根據(jù)本發(fā)明優(yōu)選實施例的在服務(wù)器端并發(fā)處理從客戶端接收到的客戶請求 的流程圖。如圖3所示,該流程可W包括W下處理步驟:
[00M]步驟S302、服務(wù)器端可W創(chuàng)建一個UDP監(jiān)聽套接字,其中,該UDP監(jiān)聽套接字用于監(jiān) 聽客戶端發(fā)送的連接請求。
[0096] 步驟S304、服務(wù)器端采用系統(tǒng)函數(shù)setsockopt對允許完全重復(fù)捆綁W及允許后續(xù) 新建的套接字(socket)能夠捆綁到相同的服務(wù)器地址上進(jìn)行設(shè)置。
[0097] 步驟S306、服務(wù)器端將本地IP地址和端口綁定到UDP監(jiān)聽套接字上。
[0098] 步驟S308-S310、服務(wù)器端在循環(huán)中等待客戶的連接請求,每當(dāng)請求到達(dá)服務(wù)器 時,服務(wù)器端將創(chuàng)建一個子線程或進(jìn)程來處理客戶端發(fā)送的連接請求。
[0099] 步驟S312、服務(wù)器端在子線程或進(jìn)程中為客戶端的連接請求創(chuàng)建一個套接字 (socket)。
[0100] 步驟S314、服務(wù)器端采用系統(tǒng)函數(shù)setsockopt對新建的套接字可W重用原來捆綁 的地址進(jìn)行設(shè)置。
[0101] 步驟S316、服務(wù)器端采用系統(tǒng)函數(shù)bind將本地服務(wù)器的IP地址和端口分別綁定到 新建的套接字(socket)關(guān)聯(lián)的UDP協(xié)議中包含的本地IP和本地端口上。
[0102] 步驟S318、服務(wù)器端采用系統(tǒng)函數(shù)connect將請求客戶端的IP地址和端口分別綁 定到新建的套接字(socket)關(guān)聯(lián)的UDP協(xié)議中包含的外部IP和外部端口上。
[0103] 步驟S320、服務(wù)器端內(nèi)的服務(wù)器程序可W在上述新建的套接字(socket)上進(jìn)行與 TCP類似的讀寫操作,進(jìn)行事務(wù)邏輯處理。
[0104] 步驟S322、服務(wù)器端處理完畢后,關(guān)閉套接字。
[0105] 需要說明的是,對于UDP而言,可W對socket套接字選項設(shè)置S0_REUSEADDR允許完 全重復(fù)的捆綁:當(dāng)一個IP地址和端口已綁定到特定套接字上時,同樣的IP地址和端口還可 W捆綁到另一個套接字上。而且,如果允許完全重復(fù)的捆綁,那么還需要將捆綁同一個IP地 址和端口的每個套接字均將S0_REUSEA孤R選項設(shè)置為允許完全重復(fù)的捆綁才能完整。在上 述步驟S306和步驟S316中由于都綁定了相同的服務(wù)器IP地址和公知端口,因此,需要設(shè)置 S0_REUSEADD選項為允許完全重復(fù)的捆綁。
[0106] 圖4是根據(jù)本發(fā)明實施例的請求消息的發(fā)送方法的流程圖。如圖1所示,該方法可 W包括W下處理步驟:
[0107] 步驟S402、在客戶端上創(chuàng)建UDP套接字,并將服務(wù)器的標(biāo)識信息與UDP套接字進(jìn)行 綁定;
[0108] 步驟S404、通過臨時UDP套接字向服務(wù)器發(fā)送請求消息。
[0109] 可選地,在步驟S404,通過臨時UDP套接字向服務(wù)器發(fā)送請求消息之后,還可W包 括W下步驟:
[0110] 步驟S7:調(diào)用系統(tǒng)函數(shù)從臨時UDP套接字讀取從服務(wù)器接收到的與請求消息對應(yīng) 的響應(yīng)數(shù)據(jù)。
[0111] 在優(yōu)選實施例中,圖5是根據(jù)本發(fā)明優(yōu)選實施例的從客戶端向服務(wù)器端發(fā)送客戶 請求的流程圖。如圖5所示,該流程可W包括W下處理步驟:
[0112] 步驟S502、客戶端創(chuàng)建一個UDP socket套接字。
[0113] 步驟S504、客戶端采用系統(tǒng)函數(shù)connect將服務(wù)器端的IP地址和端口分別綁定到 新建的socket套接字關(guān)聯(lián)的UDP協(xié)議中包含的外部IP和外部端口上,運(yùn)樣在此socket套接 字上發(fā)送數(shù)據(jù)不需要每次指定目的IP地址和端口。
[0114] 步驟S506-S508、客戶端在此socket套接字上發(fā)送一個連接請求,然后在此套接字 上進(jìn)行與TCP類似的讀寫操作,進(jìn)行事務(wù)邏輯處理。
[0115] 步驟S510、客戶端判斷事務(wù)是否完成;如果否,則返回步驟S506;如果是,則繼續(xù)執(zhí) 行步驟S512。
[0116] 步驟S512、客戶端關(guān)閉socket套接字。
[0117] 圖6是根據(jù)本發(fā)明實施例的請求消息的處理裝置的結(jié)構(gòu)框圖。如圖6所示,該請求 消息的處理裝置可W包括:創(chuàng)建模塊10,用于在服務(wù)器的預(yù)設(shè)端口上創(chuàng)建全局UDP套接字; 監(jiān)聽模塊20,用于采用全局UDP套接字監(jiān)聽客戶端發(fā)送的請求消息;通信模塊30,用于為監(jiān) 聽到的請求消息創(chuàng)建臨時UDP套接字,并通過UDP臨時套接字與客戶端進(jìn)行通信。