1.服务器端编程心得(六)—— 关于网络编程的码分一些实用技巧和细节
服务器端编程心得(六)—— 关于网络编程的一些实用技巧和细节
接触了多种项目,编写了大量网络编程代码,码分涉及 Windows 和 Linux 平台,码分积累了不少经验与心得。码分本文将分享网络编程的码分实用技巧与细节,希望对读者有所助益。码分ssp广告源码
非阻塞的码分 connect() 函数编写:在创建 socket 时将其设置为非阻塞模式,使用 connect() 进行连接。码分若能立即连接成功返回 0,码分否则返回 -1 或 EINPROGRESS。码分通过 select() 检测 socket 是码分否可写来判断连接状态。在 Windows 平台上,码分除了 select(),码分也可使用 WSAAsyncSelect 或 WSAEventSelect 来检测。码分
非阻塞 socket 下的码分收发数据:在 Linux 和 Windows 平台,先用 select()、WSAAsyncSelect() 或 epoll_wait 检测 socket 有无数据可读或可写。qt 下载界面 源码对于收发数据的代码,Linux epoll 的 ET 模式要求一次性收完所有数据;水平模式或 Windows 平台则可根据业务需求一次性收取固定大小数据或直至数据收完。设置超时时间,检测整个收发过程是否超时。
上层业务解析数据包:处理数据包前先收取固定大小的包头信息,根据包头中指定的包体大小收取包体。确保包完整后解析并传递给上层业务逻辑。注意连续接收到的e语言骂人源码数据包可能有不同组合方式,需循环处理直至完整数据包出现。
nagle 算法:开启此算法时,小数据包可能不会立即发送,合并后一次性发送。若需实时性,可禁用此算法,以立即发送小数据包。Linux 默认开启,严选商城源码禁用方法为设置 noDelay 为 1。
select 函数参数问题:在 Linux 下,参数必须设置为所有 socket 描述符句柄中的最大值加 1;Windows 下兼容性考虑,参数可填任意值。
bind 函数绑定地址:使用 0.0.0.0 绑定任意网卡地址,使用 .0.0.1 绑定本地回环地址。前者允许从任意本地网卡连接,后者仅允许连接本地回环地址。sam机架托盘源码
SO_REUSEADDR 和 SO_REUSEPORT:设置这两个选项,解决 socket 被系统回收后,短时间内无法重新绑定同一地址和端口的问题。Linux 实现更为严格,所有进程都受限,Windows 则允许本进程重复使用。
心跳包机制:通过定时发送心跳包维持连接正常。心跳包间隔时间可根据项目需求调整,确保连接状态检查与数据流量优化。客户端发送心跳包给服务器端,检测连接状态。
重连机制:在连接尝试失败后,设置递增的重试间隔时间。网络故障恢复时应立即尝试重连。Windows 下使用 IsNetworkAlive 检测网络状态变化。
EINTR 错误码处理:在 Linux 环境下,对于 network 函数检测 EINTR 错误码,表明函数因信号中断而未完成,应重新尝试或利用其他方式检查状态。
减少系统调用:优化高性能服务器程序时,尽量减少系统调用。例如,在主循环中缓存时间获取结果,避免重复调用系统函数。
忽略 SIGPIPE 信号:在 Linux 平台上,当侦听 socket 关闭后,对端发送数据会导致 SIGPIPE 信号。应忽略此信号,避免进程因异常终止。
CppGuide 学习资料:为 C/C++ 开发者准备的全面学习资源,涵盖语言基础、网络编程、操作系统原理、项目源码分析等,同时提供学习方法、推荐书籍、简历指导和求职技巧等内容。