/*将数据包头和数据进行封装打包
*/
# 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");
}
*/
# 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");
}