将数据包头和数据进行封装打包.c

/*将数据包头和数据进行封装打包
*/
# include <unistd.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <assert.h>

#define HEAD_SIZE sizeof(struct header)

//数据包包头
struct header
{
    char version[20];//版本
    char protocol[20];//协议
    int type;//数据类型
    int length;//数据长度
    char data[0];//结构尾地址
};
//数据包体
struct message {
    int id;
    char name[20];
};

//打包函数
void* Package(char* version,char *protocol,int type,int length,void *data)
{
    struct header* pack=malloc(HEAD_SIZE+length);
    assert(pack!=NULL);

    strcpy(pack->version,version);
    strcpy(pack->protocol,protocol);
    pack->type=type;
    pack->length=length;
    memcpy(pack->data,data,length);
    return (void*)pack;
}
//主函数实现打包信息在管道两侧的传输
int main()
{  
    struct header a1,b1;
    struct message b2;
    int ret;
    int fd[2];
    ret = pipe(fd);
    if (ret < 0) {
        perror("管道创建失败");
        exit(1);
    }

    strcpy(a1.version , "MSN1004");
    strcpy(a1.protocol, "Tcp");
    a1.type = 1;

    struct message a2 = {1008,"wangpandong"};

    void* p = Package(a1.version,a1.protocol,a1.type,sizeof(struct message),&a2);//将数据打包
    ret =  write(fd[1],p,sizeof(struct header)+sizeof(struct message));//写进写端
    if (ret < 0) {
        perror("写管道失败");
        exit(1);
    }
    printf("********************\n");
    ret = read (fd[0],&b1,sizeof(struct header));//从读端读取
    if (ret < 0) {
        perror("读取包头失败");
        exit(1);
    }
    printf("version is :%s\n",b1.version);
    printf("protocol is :%s\n",b1.protocol);
    printf("type is :%d\n",b1.type);
    printf("********************\n");
    ret = read (fd[0],&b2,sizeof(struct message));
    if (ret < 0) {
        perror("读取包体失败");
        exit(1);
    }
    printf("Id is :%d\n",b2.id);
    printf("name is :%s\n",b2.name);
    printf("********************\n");
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值