我只是在C中使用流式套接字,但是我在阅读从服务器应用程序返回的数据包时遇到问题。下面的代码显示了在客户端和服务器端使用的结构。从流套接字读取数据包的C错误
struct packet
{
uint16_t f1;
uint16_t f2;
uint32_t f3;
uint16_t pf1;
uint32_t pf2;
};
用于发送服务器端:
char buffer[14];
struct packet myPacket;
myPacket.f1 = 2321;
myPacket.f2 = 4423;
myPacket.f3 = 2134;
myPacket.pf1 = 765;
myPacket.pf2 = 9867;
htonPacket(myPacket, buffer);
函数数据打包到缓冲器。拆包和印刷
void htonPacket(struct packet h, char buffer[14]) {
uint16_t u16;
uint32_t u32;
u16 = htons(h.f1);
memcpy(buffer+0, &u16, 2);
u16 = htons(h.f2);
memcpy(buffer+2, &u16, 2);
u32 = htonl(h.f3);
memcpy(buffer+4, &u32, 4);
u16 = htons(h.pf1);
memcpy(buffer+8, &u16, 2);
u32 = htonl(h.pf2);
memcpy(buffer+10, &u32, 4);
}
客户端:
void ntohPacket(struct packet* h, char buffer[14]) {
uint16_t u16;
uint32_t u32;
memcpy(&u16, buffer+0, 2);
h->f1 = ntohs(u16);
memcpy(&u16, buffer+2, 2);
h->f2 = ntohs(u16);
memcpy(&u32, buffer+4, 4);
h->f3 = ntohl(u32);
memcpy(&u16, buffer+6, 2);
h->pf1 = ntohs(u16);
memcpy(&u32, buffer+8, 4);
h->pf2 = ntohl(u32);
}
印刷紧缩数据:
printf("myPacket.f1: %d\n", myPacket.f1);
printf("myPacket.f2: %d\n", myPacket.f2);
printf("myPacket.f3: %d\n", myPacket.f3);
printf("myPacket.pf1: %d\n", myPacket.pf1);
printf("myPacket.pf2: %d\n", myPacket.pf2);
当我打印值,很明显的,我有一些问题或者解决或写入错误的内存位置,但我似乎无法找到该错误。
myPacket.f1: 2321
myPacket.f2: 4423
myPacket.f3: 2134
myPacket.pf1: 2134
myPacket.pf2: 50135040
为什么所有的东西都从一个结构复制到一个变量,然后调整endianness和memcpy?你可以一口气完成'dst-> f1 = htons(src-> f1)'。只需要'struct's来处理东西,而不是单个字节的混乱(确保你必须小心编译器不要偷懒)。我认为这样重做你的代码可以解决你的问题。 – vonbrand 2013-02-08 21:31:36
我正在学习,我只是扩展了我在封包上发现的一个例子。感谢您的建议。 – dsell002 2013-02-08 21:41:28
@ vonbrand:作为回答,你会得到我的+票;) – nneonneo 2013-02-08 21:45:49