Linux 下 UDP 网络编程套接字详解
源 IP 地址和目的 IP 地址
在 IP 数据包头部中,有两个 IP 地址,分别叫做源 IP 地址和目的 IP 地址。仅拥有 IP 地址不足以完成通信,还需要一个标识来区分数据应发送给哪个程序进行解析。
认识端口号
端口号用于标识主机上的特定进程。一个进程可以绑定多个端口号,但一个端口号不能被多个进程同时绑定。
理解 "端口号" 和 "进程 ID"
进程 ID (PID) 唯一表示一个进程,端口号同样用于唯一表示一个进程。两者关系密切,但在网络通信中,端口号是跨主机通信的关键标识。
理解源端口号和目的端口号
传输层协议 (TCP 和 UDP) 的数据段中有两个端口号,分别叫做源端口号和目的端口号。这描述了'数据是谁发的'以及'要发给谁'。
IP:Port
IP 地址为 4 字节,端口号为 2 字节。在公网上,IP 地址能表示唯一的一台主机,端口号用来标识该主机上的唯一的一个进程。IP:Port=标识全网唯一的一个进程。
认识 TCP 协议与 UDP 协议
- TCP 协议:面向连接、可靠传输。
- UDP 协议:无连接、不可靠传输、速度快。
网络字节序
内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件和网络数据流同样存在大端小端之分。TCP/IP 协议规定,网络数据流应采用大端字节序(Big Endian),即低地址高字节。无论发送主机是大端机还是小端机,都会按照这个 TCP/IP 规定的网络字节序来发送/接收数据;如果当前发送主机是小端,就需要先将数据转成大端。
为使网络程序具有可移植性,使同样的 C/C++ 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
网络字节序和主机字节序的转换函数
htons():将主机字节序转换为网络字节序,适用于 16 位数据(short)。htonl():将主机字节序转换为网络字节序,适用于 32 位数据(long)。ntohs():将网络字节序转换为主机字节序,适用于 16 位数据(short)。ntohl():将网络字节序转换为主机字节序,适用于 32 位数据(long)。
示例代码
#include <stdio.h>
#include <arpa/inet.h> // 包含字节序转换函数(适用于 Linux 和 UNIX)
int main() {
uint16_t host_short = 0x1234; // 主机字节序的 16 位数据
uint32_t host_long = 0x12345678; // 主机字节序的 32 位数据
// 主机字节序转网络字节序
uint16_t network_short = (host_short);
network_long = (host_long);
converted_short = (network_short);
converted_long = (network_long);
(, host_short, network_short, converted_short);
(, host_long, network_long, converted_long);
;
}


