如何填充数据包的头?
我要编程自己填充自己的数据包头,我现在己写了自己的结构体,现要将ip,udp 和message拷到同一个buffer,做完总是发现sizeof(buffer)=4,哪位大侠能告小弟如何填充?
typedef struct ip_hdr
////ip头
{
unsigned char ip_verlen; //IP版本和长度
unsigned char ip_tos;// //IP服务类型
unsigned short ip_totallength;// //总的长度
unsigned short ip_id ;// //独一无二的标识符
unsigned short ip_offset;// //fragment offset field
unsigned char ip_ttl;// //存活时间
unsigned char ip_protocol;// //协议
unsigned short checksum;// //效检和
unsigned int ip_srcaddr;// //源地址
unsigned int ip_destaddr;// //目的地址
}IP_HDR,*PIP_HDR; //FAR* LPIP_HDR;
typedef struct udp_hdr //UDP头
{
unsigned short src_portno;// //源端口号
unsigned short dst_portno;// //目的端口号
unsigned short udp_length;// //UDP包长度
unsigned short udp_checksum;// //UDP效检和
}UDP_HDR,*PUDP_HDR;
我要编程自己填充自己的数据包头,我现在己写了自己的结构体,现要将ip,udp 和message拷到同一个buffer,做完总是发现sizeof(buffer)=4,哪位大侠能告小弟如何填充?
typedef struct ip_hdr
////ip头
{
unsigned char ip_verlen; //IP版本和长度
unsigned char ip_tos;// //IP服务类型
unsigned short ip_totallength;// //总的长度
unsigned short ip_id ;// //独一无二的标识符
unsigned short ip_offset;// //fragment offset field
unsigned char ip_ttl;// //存活时间
unsigned char ip_protocol;// //协议
unsigned short checksum;// //效检和
unsigned int ip_srcaddr;// //源地址
unsigned int ip_destaddr;// //目的地址
}IP_HDR,*PIP_HDR; //FAR* LPIP_HDR;
typedef struct udp_hdr //UDP头
{
unsigned short src_portno;// //源端口号
unsigned short dst_portno;// //目的端口号
unsigned short udp_length;// //UDP包长度
unsigned short udp_checksum;// //UDP效检和
}UDP_HDR,*PUDP_HDR;
如:char buffer[1024];
如果你这样写:char *buffer = new char[……];
那么不管你在buffer里存放什么数据,sizeof(buffer)都是4。
sizeof是看一个变量占用的多少的内存空间!
填充包头有很多种办法,一种就是你使用的拷贝的办法:
IP_HDR ip_header;
UDP_HDR udp_header;
……对各个成员设置
然后,开空间:
char *buffer = new char[sizeof(IP_HDR) + sizeof(UDP_HDR)];
memcpy(buffer, &ip_header, sizeof(IP_HDR));
memcpy(buffer + sizeof(IP_HDR), &udp_header, sizeof(UDP_HDR));
……
delete buffer;更好的办法是:
char *buffer = new char[sizeof(IP_HDR) + sizeof(UDP_HDR)];
IP_HDR *p1 = (IP_HDR *)buffer;
UDP_HDR *p2 = (UDP_HDR *)(buffer + sizeof(IP_HDR));
然后就可以直接对p1, p2直接操作了。