5.6 Linux 应用开发 网络编程
一、TCP 与 UDP 核心概念
1. 协议基础
- TCP(传输控制协议):面向连接、可靠的全双工字节流,提供超时重传、流量控制、拥塞控制,保证数据有序、不丢失。
- UDP(用户数据报协议):无连接、不可靠的报文协议,不保证顺序、不重传,开销小、延迟低。
- Socket:特殊的文件描述符,代表网络编程的资源,是应用层与传输层的接口。
- SOCK_STREAM:对应 TCP(流式套接字)。
- SOCK_DGRAM:对应 UDP(数据报套接字)。
- SOCK_RAW:原始套接字,可直接访问 IP、ICMP 等协议。
2. 网络分层模型
层级 |
对应协议 / 功能 |
应用层 |
应用程序,通过 Socket 调用 |
传输层 |
TCP/UDP,负责端到端传输 |
网络层 |
IPv4/IPv6,负责路由寻址 |
物理层 |
设备驱动 / 硬件,负责物理传输 |
二、TCP 编程核心基础
1. 网络字节序
TCP/IP 协议规定:网络流数据采用大端字节序(高位字节存低地址),主机字节序(小端 / 大端)需转换。
- 核心转换函数(
arpa/inet.h)
函数 |
功能 |
适用类型 |
|
主机 → 网络(32 位,IP) |
|
|
主机 → 网络(16 位,端口) |
|
|
网络 → 主机(32 位,IP) |
|
|
网络 → 主机(16 位,端口) |
|
2. 地址结构体
- 通用地址结构体
struct sockaddr
struct sockaddr {
sa_family_t sa_family; // 16位地址族(AF_INET=IPv4)
char sa_data[14];// 14字节地址数据
};
- IPv4 专用结构体
struct sockaddr_in
struct sockaddr_in {
sa_family_t sin_family; // 地址族,填AF_INET
in_port_t sin_port; // 16位端口号(网络字节序)
struct in_addr sin_addr; // 32位IP地址
unsigned char sin_zero[8]; // 占位符,填0
};
struct in_addr {
uint32_t s_addr; // 32位IP(网络字节序)
};
// 实际编程中用sockaddr_in填充,强转成sockaddr传入函数。
3. IP 地址转换函数
函数 |
功能 |
|
点分十进制字符串 → 32 位网络字节序整数(IPv4) |
|
32 位网络字节序整数 → 点分十进制字符串(IPv4,非线程安全) |
现代推荐用inet_pton/inet_ntop,支持 IPv4/IPv6,线程安全。
三、TCP 编程核心函数
1. socket():创建套接字
int socket(int domain, int type, int protocol); // 参数: // domain:地址族,AF_INET(IPv4)/AF_INET6(IPv6) // type:套接字类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP) // protocol:协议,填 0(自动匹配 type 对应协议) // 返回值:成功返回套接字文件描述符,失败返回 - 1 // 作用:打开一个网络通信端口,创建套接字对象
2. bind():绑定地址(服务器专用)
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); // 参数: // sockfd:socket()返回的套接字 // addr:绑定的地址(sockaddr_in强转) // addrlen:地址结构体大小(sizeof(struct sockaddr)) // 返回值:成功返回 0,失败返回 - 1 // 作用:服务器绑定 IP 和端口,INADDR_ANY表示绑定本机所有可用 IP // 填充示例: struct sockaddr_in local; loca
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++/嵌入式开发 秋招面经 文章被收录于专栏
一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。
查看4道真题和解析