用C生成数据包

时间:2015-03-03 12:55:51

标签: c

我没有收到缓冲区中的任何内容。无论我printf我的缓冲区,它总是空的或显示垃圾值。有人可以帮忙吗?

我定义了header,packet并在我的main中调用它们,但缓冲区仍显示垃圾。

#include <stdint.h>
struct header {
    uint16_t f1;
    uint16_t f2;
    uint32_t f3;
};
struct data {
    uint16_t pf1;
    uint64_t pf2;
};
#include <arpa/inet.h>
#include <string.h>
#include <stdint.h>
#include "packet.h"
void htonHeader(struct header h, char buffer[8]) {
    uint16_t u16;
    uint32_t u32;
    u16 = htons(h.f1);
    memcpy(buffer+0, &u16, 2);
    printf("Value of buff is: %hu\n",buffer);
    u16 = htons(h.f2);
    memcpy(buffer+2, &u16, 2);
    u32 = htonl(h.f3);
    memcpy(buffer+4, &u32, 4);
}
void htonData(struct data d, char buffer[10]) {
    uint16_t u16;
    uint32_t u32;
    u16 = htons(d.pf1);
    memcpy(buffer+0, &u16, 2);
    u32 = htonl(d.pf2>>32);
    memcpy(buffer+2, &u32, 4);
    u32 = htonl(d.pf2);
    memcpy(buffer+6,&u32, 4);
}
void HeaderData(struct header h, struct data d, char buffer[18]) {
    htonHeader(h, buffer+0);
    htonData(d, buffer+8);
    printf("buff is: %s\n",buffer);
}
#include <stdio.h>
#include "packet.c"
#include <string.h>
#include<stdlib.h>
int main(){ 
    struct header h;
    struct data d;
    char buff[18];
    //printf("Packet is: %s\n",buff);
    printf("Generating Packets..... \n"); 
        h.f1=1;
    d.pf1=2;
    h.f2=3;
    d.pf2=4;
        h.f3=5;
        HeaderData(h,d,buff);
    strcat(buff,buff+8);
    printf("Packet is: %s\n",buff);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

问题是您的printf()语法错误(printf( "%hu", ... );期望无符号短信作为参数,但您传递指针)或尝试使用{打印buff {1}}但内容是二进制,而不是文本。你可以做的是做某种hexdump,比如:

"%s"

请注意,使用 int i; for( i=0; i<sizeof( buff ); i++ ) { printf( "%x ", buff[i] & 0xff ); } puts( "" ); // terminate the line 仅使用im sizeof,在另一个函数中,您必须以不同方式确定缓冲区大小。

此外:由于main()的二进制内容,您无法使用buff。即使您已确定复制的最后一个值后面有strcat()(我没有检查过你是否有),根据您复制的整数值,可能还有另一个'\0'在该值之前的值,'\0'将覆盖该点上的所有内容。