字,利用系統(tǒng)內(nèi)核函數(shù)提供的功能達(dá)到了系統(tǒng)內(nèi)核級(jí)別 的并發(fā)處理的目的,從而實(shí)現(xiàn)了只需要在一個(gè)預(yù)設(shè)端口上監(jiān)聽每個(gè)客戶端發(fā)送的請(qǐng)求消 息,而不需要為每個(gè)臨時(shí)套接字都分配一個(gè)端口,另外,防火墻只需要對(duì)預(yù)設(shè)端口進(jìn)行開 放,同時(shí)還突破了在同一時(shí)間訪問服務(wù)器的請(qǐng)求消息的數(shù)量的技術(shù)效果,進(jìn)而解決了相關(guān) 技術(shù)中缺乏一種高效的并發(fā)解決方案既能滿足數(shù)據(jù)的分發(fā)需求,同時(shí)又能突破網(wǎng)絡(luò)端口和 防火墻的限制的技術(shù)問題。
【附圖說明】
[0031] 此處所說明的附圖用來提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本發(fā) 明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中:
[0032] 圖1是根據(jù)本發(fā)明實(shí)施例的請(qǐng)求消息的處理方法的流程圖;
[0033] 圖2是根據(jù)本發(fā)明優(yōu)選實(shí)施例的獨(dú)立運(yùn)行的UDP并發(fā)服務(wù)器與客戶端進(jìn)行通信交 互的示意圖;
[0034] 圖3是根據(jù)本發(fā)明優(yōu)選實(shí)施例的在服務(wù)器端并發(fā)處理從客戶端接收到的客戶請(qǐng)求 的流程圖;
[0035] 圖4是根據(jù)本發(fā)明實(shí)施例的請(qǐng)求消息的發(fā)送方法的流程圖;
[0036] 圖5是根據(jù)本發(fā)明優(yōu)選實(shí)施例的從客戶端向服務(wù)器端發(fā)送客戶請(qǐng)求的流程圖;
[0037] 圖6是根據(jù)本發(fā)明實(shí)施例的請(qǐng)求消息的處理裝置的結(jié)構(gòu)框圖;
[0038] 圖7是根據(jù)本發(fā)明優(yōu)選實(shí)施例的請(qǐng)求消息的處理裝置的結(jié)構(gòu)框圖;
[0039] 圖8是根據(jù)本發(fā)明實(shí)施例的請(qǐng)求消息的發(fā)送裝置的結(jié)構(gòu)框圖;
[0040] 圖9是根據(jù)本發(fā)明實(shí)施例的請(qǐng)求消息的發(fā)送裝置的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0041] 為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實(shí)施例中的 附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是 本發(fā)明一部分的實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人 員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本發(fā)明保護(hù)的范 圍。
[0042] 需要說明的是,本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語"第一"、"第 二"等是用于區(qū)別類似的對(duì)象,而不必用于描述特定的順序或先后次序。應(yīng)該理解運(yùn)樣使用 的數(shù)據(jù)在適當(dāng)情況下可W互換,W便運(yùn)里描述的本發(fā)明的實(shí)施例能夠W除了在運(yùn)里圖示或 描述的那些W外的順序?qū)嵤4送?,術(shù)語"包括"和"具有"W及他們的任何變形,意圖在于覆 蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于 清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶\(yùn)些過程、方法、產(chǎn)品 或設(shè)備固有的其它步驟或單元。
[0043] 根據(jù)本發(fā)明實(shí)施例,提供了一種請(qǐng)求消息的處理方法的方法實(shí)施例,需要說明的 是,在附圖的流程圖示出的步驟可W在諸如一組計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)系統(tǒng)中執(zhí)行, 并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可W W不同于此處的順序執(zhí)行 所示出或描述的步驟。
[0044] 圖1是根據(jù)本發(fā)明實(shí)施例的請(qǐng)求消息的處理方法的流程圖,如圖1所示,該方法包 括如下步驟:
[0045] 步驟S102,在服務(wù)器的預(yù)設(shè)端口上創(chuàng)建全局UDP套接字;
[0046] 步驟S104,采用全局UDP套接字監(jiān)聽客戶端發(fā)送的請(qǐng)求消息;
[0047] 步驟S106,為監(jiān)聽到的請(qǐng)求消息創(chuàng)建臨時(shí)UDP套接字,并通過UDP臨時(shí)套接字與客 戶端進(jìn)行通信。
[0048] 通過上述步驟,實(shí)現(xiàn)了只需要在一個(gè)預(yù)設(shè)端口上監(jiān)聽每個(gè)客戶端發(fā)送的請(qǐng)求消 息,而不需要為每個(gè)臨時(shí)套接字都分配一個(gè)端口,另外,防火墻只需要對(duì)預(yù)設(shè)端口進(jìn)行開 放,同時(shí)還突破了在同一時(shí)間訪問服務(wù)器的請(qǐng)求消息的數(shù)量的技術(shù)效果,進(jìn)而解決了相關(guān) 技術(shù)中缺乏一種高效的并發(fā)解決方案既能滿足數(shù)據(jù)的分發(fā)需求,同時(shí)又能突破網(wǎng)絡(luò)端口和 防火墻的限制的技術(shù)問題。
[0049] -個(gè)socket套接字是由五元組確定的,即P= (Pl協(xié)議,P2源IP地址:源端口,P3目 的IP地址:目的端口),由于在本發(fā)明所提供的技術(shù)方案中針對(duì)的是UDP的并發(fā)方案,因此, 上述協(xié)議Pl為UDP。
[0050] 可選地,在步驟S104中,采用全局UDP套接字監(jiān)聽客戶端發(fā)送的請(qǐng)求消息可W包括 W下步驟:
[0051 ]步驟Sl:將全局UDP套接字中的套接字選項(xiàng)(例如:S0_REUSEADDR)設(shè)置為允許臨時(shí) UDP套接字與全局UDP套接字同時(shí)綁定至服務(wù)器的標(biāo)識(shí)信息(包括但不限于:服務(wù)器的IP地 址和服務(wù)器的端口號(hào)),并且將服務(wù)器的標(biāo)識(shí)信息與全局UDP套接字進(jìn)行綁定;
[0052] 步驟S2:采用全局UDP套接字循環(huán)監(jiān)聽等待請(qǐng)求消息,并在請(qǐng)求消息到達(dá)服務(wù)器 時(shí),創(chuàng)建子線程或進(jìn)程處理請(qǐng)求消息。
[0053] 可選地,在步驟S106中,為請(qǐng)求消息創(chuàng)建臨時(shí)UDP套接字,并通過臨時(shí)套接字與客 戶端進(jìn)行通信可W包括W下操作:
[0054] 步驟S3:在子線程或進(jìn)程中創(chuàng)建臨時(shí)UDP套接字,并允許臨時(shí)UDP套接字對(duì)服務(wù)器 的標(biāo)識(shí){目息進(jìn)行復(fù)用;
[0055] 步驟S4:調(diào)用第一系統(tǒng)函數(shù)將服務(wù)器的標(biāo)識(shí)信息與臨時(shí)UDP套接字進(jìn)行綁定;
[0056] 步驟S5:調(diào)用第二系統(tǒng)函數(shù)將客戶端的標(biāo)識(shí)信息(包括但不限于:客戶端的IP地址 和客戶端的端口號(hào))與臨時(shí)UDP套接字進(jìn)行綁定;
[0057] 步驟S6:通過臨時(shí)UDP套接字向客戶端發(fā)送數(shù)據(jù)和/或通過臨時(shí)UDP套接字讀取從 客戶端接收到的數(shù)據(jù)。
[0058] 在優(yōu)選實(shí)施例中,圖2是根據(jù)本發(fā)明優(yōu)選實(shí)施例的獨(dú)立運(yùn)行的UDP并發(fā)服務(wù)器與客 戶端進(jìn)行通信交互的示意圖。如圖2所示,服務(wù)器在一個(gè)公知的端口(即上述預(yù)設(shè)端口)上創(chuàng) 建一個(gè)地址可復(fù)用的SCOket套接字,負(fù)責(zé)監(jiān)聽客戶連接請(qǐng)求。當(dāng)在監(jiān)聽套接字上接收到客 戶端請(qǐng)求時(shí),為此客戶請(qǐng)求創(chuàng)建一個(gè)新的地址可復(fù)用的socket套接字,由此套接字負(fù)責(zé)其 余的需要與客戶端進(jìn)行的業(yè)務(wù)邏輯通信。具體地,可W利用系統(tǒng)功能函數(shù)(即上述第一系統(tǒng) 函數(shù))bind(int bind( int sockfd,const struct sockaddr*myaddr , sock len_t acWrlen);)將本地服務(wù)器的IP地址和端口號(hào)綁定到新建的套接字上,然后再利用系統(tǒng)功能 函數(shù)(良P上述第二系統(tǒng)函數(shù))connect(int connect(int sockfd,const struct sockaddr* servad化,socklen_t ad化len);)將客戶端的IP地址和端口號(hào)也綁定到新建的套接字上。 運(yùn)樣,服務(wù)器端便可W在新創(chuàng)建的套接字上負(fù)責(zé)與客戶端之間的事務(wù)處理,而監(jiān)聽套接字 則僅負(fù)責(zé)監(jiān)聽客戶端發(fā)送的請(qǐng)求消息。由此,只需要在服務(wù)器端監(jiān)聽一個(gè)端口,便可在內(nèi)核 級(jí)別上分散了請(qǐng)求消息的流量給各個(gè)相應(yīng)的臨時(shí)UDP套接字。同時(shí),防火墻只需要開放運(yùn)個(gè) 公知端口,而不需要為每個(gè)臨時(shí)套接字都分配一個(gè)端口,另外,能夠并發(fā)處理的請(qǐng)求消息的 最大數(shù)量還可W突破65535的限制。
[0化9] bind函數(shù)(即上述第一系統(tǒng)函數(shù))可W將一個(gè)本地協(xié)議地址賦予一個(gè)套接字,并且 將一個(gè)本地的網(wǎng)絡(luò)傳輸層地址與套接字關(guān)聯(lián)起來。對(duì)于UDP而言,即,將SCOket套接字五元 組P中的P2部分(源IP地址:源端口)指定為本地的IP地址和端口,其在內(nèi)核中可W表現(xiàn)為將 此socket套接字關(guān)聯(lián)的UDP協(xié)議控制塊(PCB)中的本地IP和本地端口上進(jìn)行了綁定。進(jìn)程可 W將一個(gè)特定的IP地址和端口捆綁到套接字上,但此IP地址必須屬于其所在主機(jī)的網(wǎng)絡(luò)接 口之一。對(duì)于UDP客戶端而言,就為在該套接字上發(fā)送的IP數(shù)據(jù)報(bào)指派了源IP地址和端口。 對(duì)于UDP服務(wù)器端而言,運(yùn)就限定了該套接字只接收那些目的地為此IP地址和端口的客戶 連接。調(diào)用bind函數(shù)可W指定IP地址和/或端口,當(dāng)然也可W不指定IP地址和/或端口。 [0060]表1示出了本發(fā)明優(yōu)選實(shí)施例的為bind函數(shù)指定需要捆綁的IP地址和/或端口號(hào) 產(chǎn)生的結(jié)果。如表1所示,
[0063] 上述表格中匯總了如何根據(jù)預(yù)期的結(jié)果設(shè)置源IP和源端口的值。如果指定端口號(hào) 為0,那么內(nèi)核就在bind被調(diào)用時(shí)選擇一個(gè)臨時(shí)端口;如果指定IP地址為通配地址,那么針 對(duì)TCP而言,內(nèi)核將等到套接字已連接,或者,針對(duì)UDP而言,內(nèi)核已在套接字上發(fā)出數(shù)據(jù)報(bào) 時(shí)才選擇一個(gè)本地IP地址。
[0064] connect函數(shù)(即上述第二系統(tǒng)函數(shù))可W應(yīng)用于UDP套接字上,與TCP連接的區(qū)別 在于:沒有S次握手。只是記錄外部地址即將此socket套接字關(guān)聯(lián)的UDP協(xié)議控制塊(PCB) 中的外部IP和外部端口上進(jìn)行了指定,W便在此套接字上發(fā)送數(shù)據(jù)報(bào)時(shí)使用,即,將此 SCOket套接字五元組P中的P3部分(目的IP地址:目的端口)進(jìn)行確定。然后立即返回到調(diào)用 進(jìn)程,由此便能夠確保數(shù)據(jù)報(bào)只會(huì)被傳遞到connect函數(shù)所指定的IP和端口的socket套接 字上。
[0065] 需要說明的是,新創(chuàng)建UDP套接字默認(rèn)為未連接UDP套接字,要使其變成已連接UDP 套接字,需要對(duì)其調(diào)用connect系統(tǒng)函數(shù)。
[0066] 已連接UDP套接字與默認(rèn)的未連接UDP套接字相比,其區(qū)別主要在于W下S點(diǎn):
[0067] (1)不能為輸出操作指定目的IP地址和端口號(hào)。已寫到連接UDP套接字上的任何內(nèi) 容都自動(dòng)發(fā)送到由connect指定的協(xié)議地址(例如:IP地址和端口號(hào))。
[006引(2)不必使用recv打om函數(shù)來獲悉數(shù)據(jù)報(bào)的發(fā)送者,而改用read函數(shù)、recv函數(shù)或 recvmsg函數(shù)。在一個(gè)已連接UDP套接字上,由內(nèi)核為輸入操作返回的數(shù)據(jù)報(bào)只有那些來自 connect所指定協(xié)議地址的數(shù)據(jù)報(bào)。目的地為運(yùn)個(gè)已連接UDP套接字的本地協(xié)議(例如:IP地 址和端口號(hào)),而源地址卻不是該套接字早先connect到的協(xié)議地址的數(shù)據(jù)報(bào),將不會(huì)傳遞 到該套接字。由此便可W限制一個(gè)已連接UDP套接字能且僅能與一個(gè)對(duì)端交換數(shù)據(jù)報(bào)。