UNP——第三章,套接字编程介绍
1.套接字结构
多数套接字函数都有套接字结构参数,每个协议族都定义了自己的套接字结构,以 sockaddr_ 开始,并对应协议族的唯一后缀。
struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; char sin_zero[8]; }
对应用层编程而言,重要的只有:
sin_family, sin_addr, sin_port
2.字节序
网络字节序为大端,即先存储数据高位。
小端,则为 先存储数据地位。
可以如下判断主机字节序:
union { short a; char b[sizeof(short)]; }c;
c.b = 0x0102 if (c.b[0] == 2 && c.b[1] == 1) { printf("小端\n"); } else if (c.b[0] == 1 && c.b[1] == 2) { printf("大端\n"); } else { printf("未知\n") }
对于大小端转换函数,推荐 inet_pton, inet_ntop
不推荐 inet_aton, inet_ntoa,因为不支持 IPv6
3.封装api
为了兼容多种情况(如IPv4和IPv6的移植),可以进行如下封装:
char * sock_ntop(const struct sockaddr *sa, socklen_t salen) { switch(sa->sa_family) { case AF_INET: ..... beak; .... } }
套接字的读写不同于一般文件读写,套接字读写,即使返回值未达到预期,也不一定错误,因为可能是缓冲区满了,就需要将剩下的数据继续操作。
类似的,其他缓冲区(如管道)读写也是这样。
所以需要封装 readn, writen 等函数。
具体实现可下载unp代码:http://www.unpbook.com/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?