套接字编程Skill socket-programming

套接字编程技能是专门用于底层网络通信开发的AI辅助工具,提供跨平台TCP/UDP套接字编程的深度集成能力。该技能能够执行套接字API操作、分析缓冲区配置、调试网络连接状态,并生成优化的套接字代码。支持非阻塞I/O配置、错误处理、平台差异处理(BSD套接字与Winsock),适用于高性能网络应用开发、服务器编程、网络协议实现等场景。关键词:套接字编程,TCP/UDP,网络编程,底层网络,BSD套接字,Winsock,非阻塞I/O,网络调试,高性能网络,跨平台开发

后端开发 1 次安装 4 次浏览 更新于 2/25/2026

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)

先决条件

  • 具有套接字库访问权限的开发环境
  • 用于套接字分析的netstatss命令行工具
  • 原始套接字操作所需的适当权限(如果需要)

能力

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 用于套接字测试的容器隔离 安全的网络实验

最佳实践

  1. 始终检查返回值 - 套接字操作可能在任何点失败
  2. 使用SO_REUSEADDR - 避免开发期间的“地址已被使用”错误 n3. 设置适当的超时 - 防止无限期阻塞
  3. 处理部分读/写 - 网络I/O可能无法在一次调用中完成
  4. 正确关闭套接字 - 在close()之前使用shutdown()进行优雅终止
  5. 缓冲区大小调整 - 将缓冲区大小与应用程序吞吐量需求匹配

流程集成

此技能与以下流程集成:

  • 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"]
}

错误处理

  • 捕获完整的错误代码和消息
  • 提供平台特定的故障排除
  • 操作失败时建议替代方法
  • 链接到相关的套接字编程文档

约束

  • 未经明确批准不得创建原始套接字
  • 绑定前验证端口可用性
  • 尊重防火墙规则和网络策略
  • 记录所有套接字操作以便调试