TCP封装数据帧

bash 复制代码
void *send_data(void *arg)    //这是一个发送数据的线程
{
    int sockfd = init_tcp_cli("192.168.0.148",50000)  
    //传ip和port,port == 50000是因为大概前五万都被其它服务所占用,50000后是私人ip
    if(sockfd < 0)
    {
        return NULL;
    }
    
    unsigned char pack[128] = {0};
    int len = 0;

    while(1)
    {
        len = pack_net_data(data_g,pack)
        //data_g是一个保存数据的结构体的全局变量
        
        ssize_t size = send(sockfd,pack,len,0)
        if(size < 0)
        {
            perror("fail send:");
            break;    
        }
        sleep(1)
        //这里是为了一秒发送一次数据
    }

    close(sockfd);

    return NULL;
}

初始化cli和包装数据:

bash 复制代码
int init_tcp_cli(const char *ip,unsigned short port)
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0)
    if(sockfd < 0)
    {
        perror("fail socket:");
        return -1;
    }

    struct sockaddr_in ser;
    ser.sin_family = AF_INET;
    ser.sin_port = htons(port);
    ser.sin_addr.s_addr = inet_addr(ip);
    
    int ret = connect(sockfd,(struct sockaddr *)&ser,sizeof(ser));
    if(ret < 0)
    {
        perror("fail connect:");
        return -1;
    }

    return sockfd;
}


int pack_net_data(Data_t data,unsigned char *pack)
{
    int i = 0;
    
    pack[i++] = 0xAA;         //帧头
    pack[i++] = 20;           //根据协议确定的有效数据长度

    memcpy(&pack[i],&data.temp,sizeof(data.temp));  //把数据拷贝到pack中
    i += sizeof(data.temp);   //下标往后移

    pack[i++] = data.tim.tm_sec; 
    //把秒数放入pack,因为其它数据的写法都一样,就不写完了

    for(int j = 1; j < i;++j)  //8位和校验
    {
        pack[i] += pack[j];
    }

    ++i;
    pack[i] = 0xBB   //帧尾
    
    ++i;
    
    return i;
}
相关推荐
STDD5 分钟前
OpenRA 服务器搭建:开源重制经典红色警戒和命令与征服
运维·服务器·开源
AIDF20266 分钟前
动态大模型 Prompt 生成技术解析
服务器·llm·prompt·agent
学困昇7 分钟前
Linux 动静态库制作与原理:从 .a、.so 到 ELF 加载一次讲透
linux·运维·服务器·c语言·开发语言·c++·人工智能
历程里程碑15 分钟前
56 . 高效ET非阻塞IO服务器设计指南
java·运维·服务器·开发语言·数据结构·c++·排序算法
翼龙云_cloud26 分钟前
云代理商:Hermes Agent在量化交易中的实战应用
运维·服务器·人工智能·ai智能体·hermes agent
七夜zippoe28 分钟前
DolphinDB时间序列引擎:实时聚合计算
服务器·前端·时间序列·dolphindb·实时聚合
yqcoder32 分钟前
HTTP 进化论:从“单车道土路”到“磁悬浮列车”
网络·网络协议·http
ch3nyuyu32 分钟前
网络编程拟面试题
linux·网络
木雷坞34 分钟前
Home Assistant Docker Compose 升级失败排查:镜像、备份和设备映射
服务器·docker·home assisant
m0_7381207235 分钟前
渗透测试基础知识——从零认识JWT(JSON Web Token)身份令牌
服务器·前端·安全·web安全·网络安全·json