2020/2/17自定义协议的学习

1. 写一个自定义协议,封装了发送和接收message的模块,src/msg.c内容如下:

#include "msg.h"
#include <unistd.h>
#include <string.h>
#include <memory.h>
#include <sys/types.h>

// calculate check code 计算校验码函数
static unsigned char msg_check(Msg *message)
{
    unsigned char s = 0;
    int i;
    for(i = 0; i < sizeof(message->head); i++)
    {
        s += message->head[i];
    }
    for(i = 0; i < sizeof(message->buff); i++)
    {
        s += message->buff[i];
    }
    return s;
}


//send a message: data in buff  把参数buff中的数据发送出去
int write_msg(int sockfd, char *buff, size_t len)
{
    Msg message;
    memset(&message, 0, sizeof(message));
    strcpy(message.head, "iotek2012");
    memcpy(message.buff, buff, len);
    message.checknum = msg_check(&message);
    if(write(sockfd, &message, sizeof(message)) != sizeof(message)){
        return -1;
    }
    
}
//receive message: data in buff   把接收到的sockfd中的数据message参数buff中的读取出来
int read_msg(int sockfd, char *buff, size_t len)
{
    Msg message;
    memset(&message, 0, sizeof(message));
    size_t size;
    if((size = read(sockfd, &message, sizeof(message))) < 0){
        return -1;
    }
    else if(size == 0){
        return 0;
    }

    //check the code 检查校验码是否正确
    unsigned char s = msg_check(&message);
    if((s == (unsigned char)message.checknum) && (!strcmp("iotek2012",message.head))){//strcmp is a compare function for string
        memcpy(buff, message.buff, len);
        return sizeof(message);
    }
    return -1;
}

其中, size_t 这个类型可理解为无符号整型unsigned int,它定义在<stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>和<wchar.h>这些标准C头文件中,增加了代码的可移植性。

2. 编译测试

 在编译时使用的命令行中,-Iinclude 表示把当前目录下的include目录做为头文件的搜索目录之一
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值