91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

資源簡介

1. 架構(gòu)說明 目前的協(xié)議有如下一些特點: 1) 客戶向服務(wù)器發(fā)送請求, 每個請求的長度不定. 請求的長度在第一個INT中指定. 2) 每個服務(wù)器通常會向多種客戶提供服務(wù), 例如, TS要同時向CP, NP提供服務(wù), CP要向NP和其他CP提供服務(wù), 同時還是其他CP, TS, SP的客戶. 3) 每個服務(wù)器為客戶服務(wù)時, 通常是長期的, 會涉及多次請求-應(yīng)答的來回. 這樣的結(jié)構(gòu), 主要是為了能夠支持大量并發(fā)客戶連接而設(shè)計的. 在具有大量并發(fā)客戶 連接時, 無論采用線程還是進程, 都無法進行有效的服務(wù), 因此必須采用select 輪詢方式. 2. 基本數(shù)據(jù)結(jié)構(gòu)說明 對于每個客戶端, 需要保存該客戶端相應(yīng)的一些信息. 目前的CPnew.c, SPnew.c 和TSnew.c的核心數(shù)據(jù)結(jié)構(gòu)基本相同, 都由Session, SessionCluster (TSnew.c中) 或者 ServerDesc (CPnew.c和SPnew.c)構(gòu)成. 其中, Session是每個客戶端相關(guān)的數(shù)據(jù), SessionCluster(或者是ServerDesc)是 有關(guān)每種服務(wù)的信息, 其中有一個指向該服務(wù)相關(guān)的各個Session的指針. Session 這一數(shù)據(jù)結(jié)構(gòu)不是在有客戶請求時動態(tài)分配的, 而是在最開始初始化時就已經(jīng)分配 好的, 當(dāng)有新客戶請求到來時, 服務(wù)器搜索這一預(yù)先分配好的這些Session, 發(fā)現(xiàn)其中 有空閑則使用, 如果沒有空閑就報告錯誤. 對于TS和CP(SP)來說, 最大的區(qū)別是TS使用UDP協(xié)議, 而CP和SP則使用TCP協(xié)議, 二者的 不同在于: 1) 對于TCP協(xié)議的客戶端, 由于每個客戶端都使用不同的socket, 因此select之后 只需要看各個客戶端的fd_set是否置位就可以了, 而對于UDP客戶端, 找到相應(yīng)的 客戶端需要進行一次查找過程. TS使用了一些措施來減輕查找所帶來的開銷. 2) TCP協(xié)議中, 發(fā)來得數(shù)據(jù)是流形式的, 因此需要進行消息分塊, 有可能兩個消息 在一次read中讀完, 也有可能一個消息需要讀很多次, 這兩種情況都需要考慮, 因此 每個Session中都有一個buf, rstart, rlen, 用來存儲讀來但還沒有處理的消息, 同樣, 寫的過程中也需要考慮寫的時候有可能沒有一次寫完, 因此也需要每個Session中 保留wbuf, wstart, wlen三項. UDP中則不同, 在協(xié)議實現(xiàn)中假設(shè)每個UDP數(shù)據(jù)包中 所包含的消息都是完整的, 因此沒有這幾項. SessionCluster(或者是ServerDesc)來說, 描述了一個服務(wù), 這個服務(wù)由這樣幾個 主要的部分構(gòu)成 1) sock: 描述所所使用的socket 2) cur: 當(dāng)前客戶端的個數(shù) 3) max: 最多容納客戶端的個數(shù) 4) head: Session的頭, head[0]為第一個Session, head[max-1]為最后一個session 5) init: 這一服務(wù)中每個Session需要執(zhí)行的初始化操作. (函數(shù)指針) 6) process: 這一服務(wù)中消息的處理函數(shù) 7) closure: 這一服務(wù)中需要的析構(gòu)函數(shù) 3. 主要結(jié)構(gòu)說明 process_child: 主要函數(shù), 這一函數(shù)主要用來 設(shè)置socks和wsocks, 對于SP和CP, 只有Session的wlen>0的時候才設(shè)置wsocks; select; 對于每個ServerDesc(或者SessionCluster), 進行process_type 在SP和CP中, 為了支持PUSHLIST操作, 在每一次循環(huán)前先要進行processJob 在CP中, 還周期進行periodCheck, 用來將過期的連結(jié)清除 在TS中, 周期進行periodLog, 用來將過期的客戶連接清除 process_type: 對于每個Session, 檢查是否可讀. 如果可讀, 檢查是否有完整的消息, *(unsigned int *)(rbuf+rstart) <= rlen 調(diào)用相應(yīng)的process直到?jīng)]有完整的消息為止 檢查是否可寫, 如果可寫且wlen>0, 則進行寫 4. 其他重要的模塊 1) 配置模塊 配置模塊主要由struct NamVal, read_config, free_config組成, NamVal結(jié)構(gòu)中, Name是在cfg文件中的名字, ptr是指向存放的指針, type是數(shù)據(jù)的類型, 目前支持這樣 幾種類型 'd': 整數(shù)類型, ptr是一個整數(shù)指針 's': 字符串類型, ptr是一個指向指針的指針, (char **) 'b': 字符串buffer類型, ptr是一個char *, 使用這種類型時應(yīng)當(dāng)注意, 對于's

資源截圖

代碼片段和文件信息

評論

共有 條評論