Socket 编程概述
Socket(套接字)是应用层与 TCP/IP 协议族通信的中间软件抽象层,简单来说,它是两个网络程序之间实现数据传输的'桥梁'。无论是 TCP 还是 UDP 协议,都可以通过 Socket 接口实现跨主机、跨网络的进程间通信。
Socket 编程主要分为 TCP Socket 和 UDP Socket 两类:
- TCP Socket:基于面向连接的 TCP 协议,提供可靠、有序、字节流的传输,适用于文件传输、登录认证等对数据可靠性要求高的场景。
- UDP Socket:基于无连接的 UDP 协议,提供无可靠保证、面向数据报的传输,传输速度快、开销小,适用于聊天、音视频传输、广播等对实时性要求高的场景。
本文重点讲解 UDP Socket 的核心基础与常用接口。
UDP 核心特性
UDP 是无连接的传输层协议,决定了 UDP Socket 编程的核心特性,也是与 TCP Socket 的主要区别:
- 无连接:通信双方无需提前建立连接,客户端直接向服务端发送数据报,服务端直接接收即可。
- 面向数据报:数据以'数据报'为单位传输,每次发送/接收都是一个完整的数据报,大小通常有限制(小于 64K)。
- 无需维护连接状态:服务端可同时接收多个客户端的数据,无需为每个客户端维护连接,资源开销小。
- 无可靠保证:数据传输可丢失、乱序,UDP 协议不提供重传、确认机制,可靠性需由应用层自行实现。
- 全双工通信:一个 Socket 描述符(fd)既可以用于读取数据,也可以用于写入数据,支持同时收发。
核心 API 接口
UDP Socket 编程的接口均来自 Linux 系统的网络编程头文件。在 C/C++ 中,通常需要包含以下头文件:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
所有接口的返回值均为 int 或 ssize_t,返回 -1 表示调用失败,可通过 errno 和 strerror(errno) 查看错误原因。
1. socket() —— 创建套接字描述符
功能:创建一个 Socket 描述符,作为后续网络通信的句柄,相当于打开一个'网络文件'。
函数原型:
int socket(int domain, type, protocol);

