网络编程详解 利用TCP/IP协议簇的各种协议编程
### 网络编程详解:利用TCP/IP协议簇的各种协议编程 #### 一、基础知识:主机字节序与网络字节序 在网络编程中,字节序是一个非常基础且重要的概念,它指的是计算机系统内部存储多字节数据类型时字节的排列方式。 - **主机字节序**: - **Little-endian**:将低序字节存储在起始地址,例如Intel x86架构。 - **Big-endian**:将高序字节存储在起始地址,例如IBM PowerPC架构。 - **网络字节序**:TCP/IP协议族中的数据在网络传输时采用的是Big-endian格式,也称为网络字节序。这是因为网络通信需要一种统一的标准来确保不同架构的主机能够正确解析数据。 - **主机字节序与网络字节序的转换**: - `htonl` 和 `htons` 函数用于将主机字节序转换为网络字节序。 - `ntohl` 和 `ntohs` 函数用于将网络字节序转换为主机字节序。 ```c #include <netinet/in.h> uint16_t htons(uint16_t hostshort); uint32_t htonl(uint32_t hostlong); uint16_t ntohs(uint16_t netshort); uint32_t ntohl(uint32_t netlong); ``` #### 二、缓冲区与流量控制 - **TCP Socket缓冲区**:每个TCP Socket都有一个发送缓冲区和一个接收缓冲区。TCP具有流量控制机制,接收缓冲区的大小决定了发送方可以发送多少数据,超过这个大小的数据会被丢弃或等待接收方处理后继续发送。 - **UDP Socket缓冲区**:UDP Socket只有一个接收缓冲区,并没有流量控制,如果接收到的数据报溢出,则会自动丢弃多余的数据报。 #### 三、Socket地址结构 - **IPv4的Socket地址结构**(定长): - `struct sockaddr_in` 定义了IPv4地址的结构,包括端口和IP地址等字段。 - `struct in_addr` 包含了一个32位的网络字节序的IP地址。 - `struct in_addr s_addr` 存储IPv4地址。 - **IPv6的Socket地址结构**(定长): - `struct sockaddr_in6` 定义了IPv6地址的结构,同样包含端口和IP地址等字段。 - `struct in6_addr` 包含了一个128位的网络字节序的IP地址。 - **UNIX域Socket地址结构**(变长): - `struct sockaddr_un` 用于定义本地文件系统的Socket地址结构,通常用于进程间通信。 - **数据链路Socket地址结构**(变长): - `struct sockaddr_dl` 用于定义数据链路层的Socket地址结构,适用于较低级别的网络通信。 - **通用Socket地址结构**: - `struct sockaddr` 是一个通用的Socket地址结构,适用于多种不同的协议簇。 #### 四、IP地址字符串与网络字节序之间的转换 - **IP地址字符串与32位网络字节序IP地址的转换**: - `inet_aton`:将点分十进制的IP地址字符串转换为32位网络字节序的IP地址。 - `inet_pton`:更安全地将点分十进制的IP地址字符串转换为网络字节序的IP地址。 - `inet_addr`:直接将点分十进制的IP地址字符串转换为32位网络字节序的IP地址整数值。 - `inet_ntoa`:将32位网络字节序的IP地址转换为点分十进制的字符串表示形式。 - `inet_ntop`:将32位网络字节序的IP地址转换为点分十进制的字符串表示形式,支持IPv4和IPv6。 #### 五、网络字节流的读写 - **注意事项**:在网络编程中,读写操作可能会遇到与普通文件读写不同的情况。由于Socket缓冲区的存在,实际读写的数据量可能小于预期的数据量。 - **解决方案**:可以通过循环读取或写入的方式来确保数据完全传输。例如,使用自定义函数`readn`来确保读取指定数量的字节。 ```c ssize_t readn(int fd, void *buf, size_t n) { ssize_t nleft = n; ssize_t nread; char *ptr = buf; while (nleft > 0) { if ((nread = read(fd, ptr, nleft)) < 0) { if (errno == EINTR) { nread = 0; } else { return -1; } } else if (nread == 0) { // EOF break; } nleft -= nread; ptr += nread; } return n - nleft; } ``` 通过上述内容,我们可以了解到网络编程的基本概念和技术细节,这对于初学者来说是非常有价值的参考资料。这些知识点不仅覆盖了理论知识,还提供了实际应用中的代码示例,有助于加深理解并应用于实践项目中。
- 粉丝: 2
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助