第四章:
socket函数:
为了执行网络I/O,一个进程必须做的第一件事是调用socket函数,指定希望同学的协议类型,
int socket(int family, int type, int protocol); 成功返回非负描述符,错误返回-1;
参数 family:
AF_INET IPv4协议
AF_INET6 IPv6协议
AF_LOCAL Unix域协议
AF_ROUTE 路由套接字
AF_KEY 秘钥套接字
参数type:
SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。
OOB: 在所有数据传送前必须使用connect()来建立连接状态。
SOCK_DGRAM: 使用不连续不可靠的数据包连接, 即UDP协议。
SOCK_SEQPACKET: 提供连续可靠的数据包连接。
SOCK_RAW: 提供原始网络协议存取。
SOCK_RDM: 提供可靠的数据包连接。
SOCK_PACKET: 与网络驱动程序直接通信。
参数protocol:
IPPROTO_TCP : TCP 传输协议
IPPROTO_UDP : UDP 传输协议
IPPROTO_SCTP : SCTP 传输协议
connect函数:
TCP客户用connect函数来建立与TCP服务器的连接。
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);成功返回0 错误返回-1;
bind函数:
bind函数把一个本地协议地址赋予一个套接字。对于网际网协议,协议地址是32位的IPv4地址或者128位的IPv6地址与16位的TCP或UDP端口号的组合。
int bind(int socketfd, const struct sockaddr *myaddr, socklen_t addr) 成功返回0 错误返回-1。
listen函数:
listen函数仅由服务器调用,当socket函数创建一个套接字时,listen函数把一个未连接的套接字转化成一个被动套接字。第二个参数规定了内核应该为响应套接字排队的最大连接数。
int listen(int sockfd, int backlog) 成功返回0 错误返回-1。
accept函数:
由TCP服务器调用,用于从已完成连接队列头返回下一个已完成连接。如果已完成队列为空,那么进程被投入睡眠。
int accept(int sockfd, struct sockaddr * cliaddr, socklen_t addrlen);成功返回非负描述符,错误去返回-1。
close函数:
关闭描述符。
int close(int sockfd); 成功返回0 失败返回-1;
第六章:
阻塞式I/O:
进程调用recvfrom, 其系统调动直到数据报达到且被复制到应用进程的缓冲区中或者发生错误才返回。我们说进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的。recvfrom成功返回后,应用进程开始工作。
非阻塞式I/O:
进程把一个套接字设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误,当无数据报准备好的时候返回一个错误,当有数据报准备好的时候返回成功。
I/O复用模型:
select和poll模型,阻塞在这2个系统调用中的某一个智商,而不是阻塞在正在真正的I/O系统调用上。
信号驱动式I/O模型:
让内核在描述符就绪式发送SIGIO信号通知我们。
异步I/O模型:
告知内核启动某个操作(包括数据从内核复制我们自己的缓冲区),并让内核在整个操作完成后通知我们。
同步I/O和异步I/O对比:
同步I/O操作导致请求进程阻塞,知道I/O操作完成;同步I/O包括阻塞式I/O,非阻塞式I/O,I/O复用模型:,信号驱动式I/O模型,
异步I/O操作不导致请求进程阻塞。异步I/O包括异步I/O模型。
select函数:
select告知内核中哪些描述符就绪(读,写或异常条件)
int select(int maxfdp1, fd_set *readset, fd_set * writeset, fd_set *exceptset, const struct timeval * timeout);
maxfdp1是指最大描述符数量,readset是可读描述符集合,writeset是可写描述符集合,exceptset是可接受连接描述符集合,timeval是设置select的时间设置。
kbengine
服务器目录结构:
|- kbengine (KBE_ROOT 根目录)
|- assets (默认的游戏项目资产库,你可以添加新的资产库通过环境变量绑定)
|- res (所有资源文件)
|- spaces (通常存放游戏场景相关的资源,例如Navmesh)
|- server (通常放置服务端相关的配置文件)
|- scripts (所有的游戏逻辑,Python文件)
|- base (Base的Python逻辑)
|- cell (Cell的Python逻辑)
|- client (Client的Python逻辑)
|- bots (机器人的Python逻辑,压力测试)
|- common (逻辑公共文件夹)
|- data (游戏逻辑用到的数据资源)
|- db (dbmgr扩展脚本)
|- entity_defs (实体定义与声明)
|- interfaces (实体的接口声明)
|- server_common (服务端逻辑公共)
|- user_type (自定义用户类型目录)
|- kbe (引擎目录)
|- tools (引擎工具)
|- server (引擎服务端工具)
|- guiconsole (可视化的控制台工具)
|- install (引擎安装工具)
|- pycluster (跨平台的集群控制Python脚本工具)
|- xlsx2py (游戏数据表导出工具)
|- src (KBEngine源代码)
|- build (makefile公共脚本)
|- client (客户端插件和例子目录)
|- kbengine_dll (Windows应用程序插件源代码)
|- common (公共目录)
|- lib (各种模块源代码)
|- client_lib (客户端底层公共框架)
|- cstdkbe (KBEngine标准库)
|- db_mysql (Mysql存取实现)
|- dbmgr_lib (数据存取公共接口)
|- dependencies (依赖库)
|- entitydef (实体定义解析模块)
|- helper (一些通用的协助性模块)
|- math (数学相关)
|- navigation (2D/3D导航模块)
|- network (网络模块)
|- pyscript (脚本插件)
|- python (python源代码)
|- resmgr (资源管理器)
|- server (服务端公共模块)
|- thread (多线程模块)
|- xmlplus (xml解析库)
|- libs (编译后的*.lib, *.a文件)
|- server (服务端app源代码)
|- baseapp (baseapp源代码)
|- baseappmgr (baseappmgr源代码)
|- cellapp (cellapp源代码)
|- cellappmgr (cellappmgr源代码)
|- dbmgr (dbmgr源代码)
|- loginapp (loginapp源代码)
|- machine (machine源代码)
|- resourcemgr (resourcemgr源代码)
|- tools (服务端助手工具)
|- interfaces (支持第三方计费、第三方账号等接口)
|- bots (压力测试, 虚拟客户端, 源码)
|- guiconsole (可视化的控制台工具源码)
|- message_log (服务端log收集工具源码)
|- res (引擎资源目录)
|- key (RSA密钥)
|- scripts (Python脚本库)
|- server (服务端引擎配置)
|- log4cxx_properties (log4cxx配置)
|- doc (指南文档源代码)
|- bin (编译后的可执行文件存放目录)
|- client (编译后的客户端exe可执行文件存放目录)
|- server (编译后的服务端可执行文件存放目录)
|- logs (服务端运行日志)
|- tutoria