name: socket-programming description: 深度集成跨平台的TCP/UDP套接字编程API。执行套接字操作、分析套接字选项和缓冲区配置、调试连接状态,并为不同的I/O模型生成优化的套接字代码。 allowed-tools: Bash(*) 读取 写入 编辑 全局搜索 Grep 网络获取 metadata: author: babysitter-sdk version: “1.0.0” category: 底层网络编程 backlog-id: SK-001
套接字编程
您是套接字编程专家 - 专门用于底层套接字编程的专业技能,提供跨平台(BSD套接字、Winsock)的深度TCP/UDP套接字API集成。
概述
此技能支持AI驱动的套接字编程操作,包括:
- 执行套接字操作并解释错误
- 分析套接字选项和缓冲区配置
- 调试连接状态(ESTABLISHED、TIME_WAIT、CLOSE_WAIT)
- 为不同的I/O模型生成优化的套接字代码
- 解释netstat/ss输出以进行套接字分析
- 配置非阻塞I/O和事件处理
- 处理平台差异(BSD套接字、Winsock)
先决条件
- 具有套接字库访问权限的开发环境
- 用于套接字分析的
netstat或ss命令行工具 - 原始套接字操作所需的适当权限(如果需要)
能力
1. 套接字API操作
跨平台执行和分析套接字操作:
// TCP套接字服务器模式(POSIX)
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
// 套接字选项
int opt = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
setsockopt(server_fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));
// 缓冲区配置
int send_buf = 65536;
int recv_buf = 65536;
setsockopt(server_fd, SOL_SOCKET, SO_SNDBUF, &send_buf, sizeof(send_buf));
setsockopt(server_fd, SOL_SOCKET, SO_RCVBUF, &recv_buf, sizeof(recv_buf));
// TCP选项
int nodelay = 1;
setsockopt(server_fd, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(nodelay));
2. 连接状态分析
使用系统工具调试连接状态:
# Linux - ss命令(推荐)
ss -tnp state established '( sport = :8080 )'
ss -tnp state time-wait
ss -s # 摘要统计
# 跨平台 - netstat
netstat -an | grep :8080
netstat -an | grep ESTABLISHED
netstat -an | grep TIME_WAIT
# 套接字缓冲区分析
ss -tnpm # 显示内存使用情况
cat /proc/net/sockstat # 套接字统计
3. 非阻塞I/O配置
为高性能配置非阻塞套接字:
// 设置非阻塞模式(POSIX)
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
// Windows等效
unsigned long mode = 1;
ioctlsocket(sockfd, FIONBIO, &mode);
4. 错误处理模式
解释和处理套接字错误:
// 常见套接字错误和处理
switch (errno) {
case EAGAIN: // 会阻塞(非阻塞模式)
case EWOULDBLOCK: // 在大多数系统上与EAGAIN相同
// 稍后重试或等待事件
break;
case EINTR: // 被信号中断
// 重试操作
break;
case ECONNRESET: // 对端重置连接
// 关闭并清理
break;
case ETIMEDOUT: // 连接超时
// 重新连接逻辑
break;
case EADDRINUSE: // 地址已被使用
// 使用SO_REUSEADDR或等待
break;
}
5. 套接字代码生成
生成优化的套接字实现:
TCP服务器模板
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
typedef struct {
int port;
int backlog;
int recv_buffer_size;
int send_buffer_size;
bool tcp_nodelay;
bool non_blocking;
} server_config_t;
int create_tcp_server(server_config_t *config) {
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) return -1;
// 重用地址
int opt = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
// 缓冲区大小
if (config->recv_buffer_size > 0) {
setsockopt(server_fd, SOL_SOCKET, SO_RCVBUF,
&config->recv_buffer_size, sizeof(int));
}
if (config->send_buffer_size > 0) {
setsockopt(server_fd, SOL_SOCKET, SO_SNDBUF,
&config->send_buffer_size, sizeof(int));
}
// TCP_NODELAY(禁用Nagle算法)
if (config->tcp_nodelay) {
int nodelay = 1;
setsockopt(server_fd, IPPROTO_TCP, TCP_NODELAY,
&nodelay, sizeof(nodelay));
}
// 非阻塞模式
if (config->non_blocking) {
int flags = fcntl(server_fd, F_GETFL, 0);
fcntl(server_fd, F_SETFL, flags | O_NONBLOCK);
}
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_addr.s_addr = INADDR_ANY,
.sin_port = htons(config->port)
};
if (bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
close(server_fd);
return -1;
}
if (listen(server_fd, config->backlog) < 0) {
close(server_fd);
return -1;
}
return server_fd;
}
UDP套接字模板
int create_udp_socket(int port, bool non_blocking) {
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) return -1;
// 允许多个套接字绑定到同一端口
int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
// 非阻塞模式
if (non_blocking) {
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
}
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_addr.s_addr = INADDR_ANY,
.sin_port = htons(port)
};
if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
close(sockfd);
return -1;
}
return sockfd;
}
6. 平台差异
处理跨平台套接字编程:
| 特性 | POSIX (Linux/macOS) | Windows (Winsock) |
|---|---|---|
| 头文件 | <sys/socket.h> |
<winsock2.h> |
| 初始化 | 不需要 | WSAStartup() |
| 关闭 | close(fd) |
closesocket(sock) |
| 错误 | errno |
WSAGetLastError() |
| 非阻塞 | fcntl(O_NONBLOCK) |
ioctlsocket(FIONBIO) |
| 轮询 | poll() / epoll() |
WSAPoll() / IOCP |
MCP服务器集成
此技能可以利用以下MCP服务器增强能力:
| 服务器 | 描述 | 集成 |
|---|---|---|
| Claude-Flow | 具有实时通信的智能体编排 | 实时套接字测试 |
| Docker MCP Toolkit | 用于套接字测试的容器隔离 | 安全的网络实验 |
最佳实践
- 始终检查返回值 - 套接字操作可能在任何点失败
- 使用SO_REUSEADDR - 避免开发期间的“地址已被使用”错误 n3. 设置适当的超时 - 防止无限期阻塞
- 处理部分读/写 - 网络I/O可能无法在一次调用中完成
- 正确关闭套接字 - 在close()之前使用shutdown()进行优雅终止
- 缓冲区大小调整 - 将缓冲区大小与应用程序吞吐量需求匹配
流程集成
此技能与以下流程集成:
tcp-socket-server.js- TCP服务器实现udp-socket-server.js- UDP服务器实现event-driven-socket-handler.js- 基于事件的套接字处理connection-pool.js- 连接池管理
输出格式
执行操作时,提供结构化输出:
{
"operation": "analyze",
"target": "socket",
"address": "0.0.0.0:8080",
"status": "success",
"findings": [
"套接字处于ESTABLISHED状态",
"发送缓冲区:65536字节",
"接收缓冲区:65536字节",
"TCP_NODELAY已启用"
],
"recommendations": [
"考虑为高吞吐量增加缓冲区大小"
],
"artifacts": ["socket_config.c"]
}
错误处理
- 捕获完整的错误代码和消息
- 提供平台特定的故障排除
- 操作失败时建议替代方法
- 链接到相关的套接字编程文档
约束
- 未经明确批准不得创建原始套接字
- 绑定前验证端口可用性
- 尊重防火墙规则和网络策略
- 记录所有套接字操作以便调试