TCP套接字通信核心要点

TCP套接字通信核心要点


通信模型架构

客户端-服务端模型

  • CS架构:客户端发起请求,服务端响应和处理请求
  • 双向通道:建立连接后实现全双工通信

服务端搭建流程

核心步骤

  1. 创建套接字

    复制代码
    int server = socket(AF_INET, SOCK_STREAM, 0);
    • 参数说明:AF_INET(IPv4)、SOCK_STREAM(TCP)、协议自动选择
  2. 绑定地址

    复制代码
    struct sockaddr_in addr = {
        .sin_family = AF_INET,
        .sin_port = htons(port),
        .sin_addr.s_addr = INADDR_ANY
    };
    bind(server, (struct sockaddr*)&addr, sizeof(addr));
    • 关键操作:字节序转换(htons)、IP绑定策略(INADDR_ANY
  3. 监听连接

    复制代码
    listen(server, 10); // 监听队列长度=10
  4. 接受连接

    复制代码
    int client = accept(server, (struct sockaddr*)&client_addr, &client_len);
    • 获取客户端地址:inet_ntop转换IP,ntohs转换端口
  5. 数据交互

    • 读取数据:read()recv()
    • 终止条件:返回值为0时表示客户端断开

客户端搭建流程

核心步骤

  1. 创建套接字

    复制代码
    int client = socket(AF_INET, SOCK_STREAM, 0);
  2. 设置服务端地址

    复制代码
    struct sockaddr_in addr = {
        .sin_family = AF_INET,
        .sin_port = htons(server_port),
        .sin_addr.s_addr = inet_addr("192.168.1.1")
    };
  3. 建立连接

    复制代码
    connect(client, (struct sockaddr*)&addr, sizeof(addr));
  4. 发送数据

    复制代码
    write(client, buffer, sizeof(buffer));

协议包设计

结构体定义

复制代码
typedef struct Pack {
    int packsize;    // 总字节数(含包头)
    char buf[4096];  // 数据缓冲区
    int used;        // 已使用字节数
} pack_t;

关键操作

  1. 数据封装

    复制代码
    void append(pack_t* pack, const char* str) {
        short len = strlen(str);
        *(short*)(pack->buf + pack->used) = len; // 写入长度
        memcpy(pack->buf + pack->used + 2, str, len); // 写入内容
        pack->used += (len + 2);
        pack->packsize = 4 + pack->used; // 更新总大小(含4字节包头)
    }
  2. 数据解析

    复制代码
    char** analysis(pack_t* pack) {
        char* buf = pack->buf;
        char** list = calloc(20, 8); // 存储解析后的字段
        int readed_size = 0;
        while (*(short*)(buf + readed_size) != 0) {
            short len = *(short*)(buf + readed_size);
            readed_size += 2;
            memcpy(temp, buf + readed_size, len);
            list[i++] = strdup(temp); // 动态分配存储
        }
        return list;
    }

关键问题处理

粘包与拆包

  • 粘包:多次发送的小数据包合并传输
  • 拆包:大数据包拆分发送(如超过1500字节限制)
  • 解决方案:协议包头声明数据长度,接收方按长度解析

连接管理

  • 服务端维护 :通过accept()返回的客户端描述符管理多个连接
  • 异常断开检测read()返回0时表示客户端主动关闭

代码实践要点

  • 错误处理 :检查socket()/bind()/listen()/connect()的返回值
  • 资源释放close()关闭套接字,free()释放动态内存
  • 字节序转换 :端口号使用htons/ntohs,IP使用inet_ntop/pton

总结:TCP套接字通信围绕地址绑定、连接管理、协议设计展开,需掌握服务端/客户端搭建流程、粘包处理及协议包解析方法,结合错误处理实现稳定通信。

相关推荐
老王熬夜敲代码1 小时前
网络中数据传输的具体过程
linux·网络·笔记
汤愈韬2 小时前
TK_网络基础和常见攻击(笔记)
网络·笔记
北邮刘老师3 小时前
【智能体互联协议解析】需要“智能体名字系统”(ANS)吗?
网络·人工智能·大模型·智能体·智能体互联网
照海19Gin4 小时前
【企业网架构实验解析】三层组网与 AC+AP 无线部署的协议逻辑(eNSP 仿真实践)
网络
Lilixxs4 小时前
wireshark LLDP 协议抓包获取 M580 PLC 网口地址
网络·测试工具·wireshark·plc·施耐德·lldp·m580
vortex55 小时前
Linux下局域网IPv6地址发现与扫描
网络
北邮刘老师5 小时前
【智能体互联协议解析】身份码-智能体的身份证号
网络·人工智能·大模型·智能体·智能体互联网
别来无恙blwy5 小时前
SQL Server高可用自动故障转移失败(短时间内多次转移失败,只需一步可处理)
数据库·windows·sqlserver·负载均衡·可用性测试
日更嵌入式的打工仔6 小时前
Ethercat COE 笔记
网络·笔记·ethercat
UVM_ERROR8 小时前
UVM实战:RDMA Host侧激励开发全流程问题排查与解决
服务器·网络·数据库