我一直在使用C语言进行UDP可靠传输。我有一个格式如下的结构:
struct packet
{
uint16_t cksum; /* Ack and Data */
uint16_t len; /* Ack and Data */
uint32_t ackno; /* Ack and Data */
uint32_t seqno; /* Data only */
char data[500]; /* Data only; Not always 500 bytes, can be less */
};
typedef struct packet packet_t;
然后我调用一个返回名为htonheader(packet_t p)的char *的函数。 该函数应该采用标题的所有部分,并使用适当的(htons / htonl)函数将它们转换为网络格式。
char* htonheader(packet_t p)
{
printf("Converting Header to Network Format\n");
printf("Packet to convert:\n");
print_pkt(p);
char *head; // Converted header to return
uint16_t u16; // Used to hold converted values uint16_t
uint32_t u32; // Used to hold converted values uint32_t
u16 = htons(p.cksum);
printf("u16: %d\n",u16);
memcpy(head+0,&u16,sizeof(u16));
printf("Header with Checksum: %s\n",head);
u16=htons(p.len);
printf("u16: %d\n",u16);
memcpy(head+2,&u16,sizeof(u16));
printf("Header with Length: %s\n",head);
u32=htonl(p.ackno);
printf("u32: %d\n",u32);
memcpy(head+4,&u32,sizeof(u32));
printf("Header with Ack No: %s\n",head);
u32=htonl(p.seqno);
printf("u32: %d\n",u32);
memcpy(head+8,&u32,sizeof(u32));
printf("Header with Seq No: %s\n",head);
return head;
}
当我发送带有消息的数据包时,以下是输出:
Converting Header to Network Format
Packet to convert:
Cksum - 0
Len - 13
Ackno - 0
Seqno - 0
Data - test message
u16: 0
Header with Checksum:
u16: 3328
Header with Length:
u32: 0
Header with Ack No:
u32: 0
Header with Seq No:
Generated Header:
如果我正确编码了memcpy,它应该显示带有一些数据的标题。相反它什么都不显示,所以当我发送附加消息的标题时,只发送一条消息。你们这些/女孩能不能给我一些见解,告诉我为什么它不起作用?我试着查看一堆类似的memcpy示例,甚至是UDP示例,我仍然无法找到问题。谢谢。
答案 0 :(得分:2)
好的,它不是一个字符串。它是一堆整数值,您将其填充到char *
引用的某个内存中。
其次,您需要为head
实际分配一些内存以指向。