[英]C error reading packet from streaming socket
我只是在玩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
好吧,您在memcpy
操作中使用了不同的偏移量,因此当然会产生垃圾...
memcpy(buffer+0, &u16, 2);
memcpy(buffer+2, &u16, 2);
memcpy(buffer+4, &u32, 4);
memcpy(buffer+8, &u16, 2);
memcpy(buffer+10, &u32, 4);
与
memcpy(&u16, buffer+0, 2);
memcpy(&u16, buffer+2, 2);
memcpy(&u32, buffer+4, 4);
memcpy(&u16, buffer+6, 2);
memcpy(&u32, buffer+8, 4);
您在ntohPacket
最后ntohPacket
行应阅读
memcpy(&u16, buffer+8, 2);
h->pf1 = ntohs(u16);
memcpy(&u32, buffer+10, 4);
h->pf2 = ntohl(u32);
您的memcpy偏移量是错误的。 固定:
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+8, 2); <-- here
h->pf1 = ntohs(u16);
memcpy(&u32, buffer+10, 4); <-- here
h->pf2 = ntohl(u32);
为什么所有将一个结构中的内容复制到一个变量,然后调整字节序和memcpy的共舞? 您可以dst->f1 = htons(src->f1)
完成dst->f1 = htons(src->f1)
。 只用struct
来处理内容而不是笨拙地使用单个字节要容易得多(请确保编译器不要潜入填充)。 我认为以这种方式重做代码将解决您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.