如何使用 C++ 进行 TCP 和 UDP 数据读写的基础知识
get/setsockopt
getsockopt 和 setsockopt 是套接字编程中用于获取和设置套接字选项的两个重要系统调用,它们允许开发者配置和查询套接字的各种参数,以控制网络通信的行为。
函数原型
1 |
|
参数说明
-
sockfd:套接字描述符,标识要操作的套接字。
-
level:选项所在的协议层级,常见值包括:
SOL_SOCKET:通用套接字选项(适用于所有协议)IPPROTO_TCP:TCP 协议特定选项IPPROTO_IP:IP 协议特定选项- 其他协议(如
IPPROTO_UDP、IPPROTO_IPV6等)
-
optname:要获取或设置的具体选项名称(与 level 对应)。
-
optval:
- 对于
setsockopt:指向要设置的选项值的缓冲区 - 对于
getsockopt:指向存储获取结果的缓冲区
- 对于
-
optlen:
- 对于
setsockopt:指定 optval 缓冲区的长度 - 对于
getsockopt:输入时指定缓冲区长度,输出时返回实际读取的长度
- 对于
返回值
-
成功:返回 0
-
失败:返回 -1,并设置
errno
常用选项示例
1. SOL_SOCKET 层级(通用选项)
-
SO_REUSEADDR:允许重用本地地址和端口1
2int reuse = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)); -
SO_RCVBUF/SO_SNDBUF:获取 / 设置接收 / 发送缓冲区大小1
2
3int bufsize;
socklen_t len = sizeof(bufsize);
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &bufsize, &len); -
SO_KEEPALIVE:启用 TCP 保活机制1
2int keepalive = 1;
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive));
2. IPPROTO_TCP 层级(TCP 选项)
-
TCP_NODELAY:禁用 Nagle 算法(减少延迟,可能增加带宽消耗)1
2int nodelay = 1;
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(nodelay));
3. IPPROTO_IP 层级(IP 选项)
-
IP_TTL:设置 IP 数据包的生存时间(TTL)1
2int ttl = 64;
setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
使用场景
-
网络性能优化:调整缓冲区大小、启用 / 禁用特定算法
-
连接管理:设置超时、控制地址重用
-
协议行为定制:如 TCP 保活、Nagle 算法等
-
调试与监控:获取套接字当前状态信息
注意事项
-
选项的可用性取决于系统和协议栈实现
-
某些选项只能在特定阶段设置(如
SO_REUSEADDR通常在绑定前设置) -
对于数值型选项,通常使用
int类型存储值 -
错误处理很重要,需检查返回值并处理可能的错误