第四章:
socket函數(shù):
為了執(zhí)行網(wǎng)絡(luò)I/O,一個(gè)進(jìn)程必須做的第一件事是調(diào)用socket函數(shù),指定希望同學(xué)的協(xié)議類型,
int socket(int family, int type, int protocol); 成功返回非負(fù)描述符,錯(cuò)誤返回-1;
參數(shù) family:
AF_INET IPv4協(xié)議
AF_INET6 IPv6協(xié)議
AF_LOCAL Unix域協(xié)議
AF_ROUTE 路由套接字
AF_KEY? 秘鑰套接字
參數(shù)type:
SOCK_STREAM: 提供面向連接的穩(wěn)定數(shù)據(jù)傳輸,即TCP協(xié)議。
OOB: 在所有數(shù)據(jù)傳送前必須使用connect()來建立連接狀態(tài)。
SOCK_DGRAM: 使用不連續(xù)不可靠的數(shù)據(jù)包連接, 即UDP協(xié)議。
SOCK_SEQPACKET: 提供連續(xù)可靠的數(shù)據(jù)包連接。
SOCK_RAW: 提供原始網(wǎng)絡(luò)協(xié)議存取。
SOCK_RDM: 提供可靠的數(shù)據(jù)包連接。
SOCK_PACKET: 與網(wǎng)絡(luò)驅(qū)動(dòng)程序直接通信。
參數(shù)protocol:
IPPROTO_TCP : TCP 傳輸協(xié)議
IPPROTO_UDP : UDP 傳輸協(xié)議
IPPROTO_SCTP? : SCTP 傳輸協(xié)議
connect函數(shù):
TCP客戶用connect函數(shù)來建立與TCP服務(wù)器的連接。
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);成功返回0 錯(cuò)誤返回-1;
bind函數(shù):
bind函數(shù)把一個(gè)本地協(xié)議地址賦予一個(gè)套接字。對(duì)于網(wǎng)際網(wǎng)協(xié)議,協(xié)議地址是32位的IPv4地址或者128位的IPv6地址與16位的TCP或UDP端口號(hào)的組合。
int bind(int socketfd, const struct sockaddr *myaddr, socklen_t addr) 成功返回0 錯(cuò)誤返回-1。
listen函數(shù):
listen函數(shù)僅由服務(wù)器調(diào)用,當(dāng)socket函數(shù)創(chuàng)建一個(gè)套接字時(shí),listen函數(shù)把一個(gè)未連接的套接字轉(zhuǎn)化成一個(gè)被動(dòng)套接字。第二個(gè)參數(shù)規(guī)定了內(nèi)核應(yīng)該為響應(yīng)套接字排隊(duì)的最大連接數(shù)。
int listen(int sockfd, int backlog) 成功返回0 錯(cuò)誤返回-1。
accept函數(shù):
由TCP服務(wù)器調(diào)用,用于從已完成連接隊(duì)列頭返回下一個(gè)已完成連接。如果已完成隊(duì)列為空,那么進(jìn)程被投入睡眠。
int accept(int sockfd, struct sockaddr * cliaddr, socklen_t addrlen);成功返回非負(fù)描述符,錯(cuò)誤去返回-1。
close函數(shù):
關(guān)閉描述符。
int close(int sockfd); 成功返回0 失敗返回-1;
第六章:
阻塞式I/O:
進(jìn)程調(diào)用recvfrom, 其系統(tǒng)調(diào)動(dòng)直到數(shù)據(jù)報(bào)達(dá)到且被復(fù)制到應(yīng)用進(jìn)程的緩沖區(qū)中或者發(fā)生錯(cuò)誤才返回。我們說進(jìn)程在從調(diào)用recvfrom開始到它返回的整段時(shí)間內(nèi)是被阻塞的。recvfrom成功返回后,應(yīng)用進(jìn)程開始工作。
非阻塞式I/O:
進(jìn)程把一個(gè)套接字設(shè)置成非阻塞是在通知內(nèi)核:當(dāng)所請(qǐng)求的I/O操作非得把本進(jìn)程投入睡眠才能完成時(shí),不要把本進(jìn)程投入睡眠,而是返回一個(gè)錯(cuò)誤,當(dāng)無數(shù)據(jù)報(bào)準(zhǔn)備好的時(shí)候返回一個(gè)錯(cuò)誤,當(dāng)有數(shù)據(jù)報(bào)準(zhǔn)備好的時(shí)候返回成功。
I/O復(fù)用模型:
select和poll模型,阻塞在這2個(gè)系統(tǒng)調(diào)用中的某一個(gè)智商,而不是阻塞在正在真正的I/O系統(tǒng)調(diào)用上。
信號(hào)驅(qū)動(dòng)式I/O模型:
讓內(nèi)核在描述符就緒式發(fā)送SIGIO信號(hào)通知我們。
異步I/O模型:
告知內(nèi)核啟動(dòng)某個(gè)操作(包括數(shù)據(jù)從內(nèi)核復(fù)制我們自己的緩沖區(qū)),并讓內(nèi)核在整個(gè)操作完成后通知我們。
同步I/O和異步I/O對(duì)比:
同步I/O操作導(dǎo)致請(qǐng)求進(jìn)程阻塞,知道I/O操作完成;同步I/O包括阻塞式I/O,非阻塞式I/O,I/O復(fù)用模型:,信號(hào)驅(qū)動(dòng)式I/O模型,
異步I/O操作不導(dǎo)致請(qǐng)求進(jìn)程阻塞。異步I/O包括異步I/O模型。
select函數(shù):
select告知內(nèi)核中哪些描述符就緒(讀,寫或異常條件)
int select(int maxfdp1, fd_set *readset, fd_set * writeset, fd_set *exceptset, const struct timeval * timeout);
maxfdp1是指最大描述符數(shù)量,readset是可讀描述符集合,writeset是可寫描述符集合,exceptset是可接受連接描述符集合,timeval是設(shè)置select的時(shí)間設(shè)置。
kbengine
服務(wù)器目錄結(jié)構(gòu):
|- kbengine (KBE_ROOT 根目錄)
|- assets (默認(rèn)的游戲項(xiàng)目資產(chǎn)庫(kù),你可以添加新的資產(chǎn)庫(kù)通過環(huán)境變量綁定)
|- res (所有資源文件)
|- spaces (通常存放游戲場(chǎng)景相關(guān)的資源,例如Navmesh)
|- server (通常放置服務(wù)端相關(guān)的配置文件)
|- scripts (所有的游戲邏輯,Python文件)
|- base (Base的Python邏輯)
|- cell (Cell的Python邏輯)
|- client (Client的Python邏輯)
|- bots (機(jī)器人的Python邏輯,壓力測(cè)試)
|- common (邏輯公共文件夾)
|- data (游戲邏輯用到的數(shù)據(jù)資源)
|- db (dbmgr擴(kuò)展腳本)
|- entity_defs (實(shí)體定義與聲明)
|- interfaces (實(shí)體的接口聲明)
|- server_common (服務(wù)端邏輯公共)
|- user_type (自定義用戶類型目錄)
|- kbe (引擎目錄)
|- tools (引擎工具)
|- server (引擎服務(wù)端工具)
|- guiconsole (可視化的控制臺(tái)工具)
|- install (引擎安裝工具)
|- pycluster (跨平臺(tái)的集群控制Python腳本工具)
|- xlsx2py (游戲數(shù)據(jù)表導(dǎo)出工具)
|- src (KBEngine源代碼)
|- build (makefile公共腳本)
|- client (客戶端插件和例子目錄)
|- kbengine_dll (Windows應(yīng)用程序插件源代碼)
|- common (公共目錄)
|- lib (各種模塊源代碼)
|- client_lib (客戶端底層公共框架)
|- cstdkbe (KBEngine標(biāo)準(zhǔn)庫(kù))
|- db_mysql (Mysql存取實(shí)現(xiàn))
|- dbmgr_lib (數(shù)據(jù)存取公共接口)
|- dependencies (依賴庫(kù))
|- entitydef (實(shí)體定義解析模塊)
|- helper (一些通用的協(xié)助性模塊)
|- math (數(shù)學(xué)相關(guān))
|- navigation (2D/3D導(dǎo)航模塊)
|- network (網(wǎng)絡(luò)模塊)
|- pyscript (腳本插件)
|- python (python源代碼)
|- resmgr (資源管理器)
|- server (服務(wù)端公共模塊)
|- thread (多線程模塊)
|- xmlplus (xml解析庫(kù))
|- libs (編譯后的*.lib, *.a文件)
|- server (服務(wù)端app源代碼)
|- baseapp (baseapp源代碼)
|- baseappmgr (baseappmgr源代碼)
|- cellapp (cellapp源代碼)
|- cellappmgr (cellappmgr源代碼)
|- dbmgr (dbmgr源代碼)
|- loginapp (loginapp源代碼)
|- machine (machine源代碼)
|- resourcemgr (resourcemgr源代碼)
|- tools (服務(wù)端助手工具)
|- interfaces (支持第三方計(jì)費(fèi)、第三方賬號(hào)等接口)
|- bots (壓力測(cè)試, 虛擬客戶端, 源碼)
|- guiconsole (可視化的控制臺(tái)工具源碼)
|- message_log (服務(wù)端log收集工具源碼)
|- res (引擎資源目錄)
|- key (RSA密鑰)
|- scripts (Python腳本庫(kù))
|- server (服務(wù)端引擎配置)
|- log4cxx_properties (log4cxx配置)
|- doc (指南文檔源代碼)
|- bin (編譯后的可執(zhí)行文件存放目錄)
|- client (編譯后的客戶端exe可執(zhí)行文件存放目錄)
|- server (編譯后的服務(wù)端可執(zhí)行文件存放目錄)
|- logs (服務(wù)端運(yùn)行日志)
|- tutoria