我正在使用C上的TCP套接字编写客户端服务器应用程序。 为了将数据写入服务器,我发送的结构如下:
typedef struct
{
uint64_t IEEE_ADDR;
uint8_t endpoint;
char requestedAction;
uint8_t level;
uint8_t wc;
uint8_t address_mode;
uint8_t gID;
uint8_t sID;
uint8_t val1;
uint8_t val0;
uint8_t status;
}dsfeedbackPkt;
为了序列化和发送数据,我写了以下函数:
void fb_serialise_send(dsfeedbackPkt *pkt)
{
unsigned char buffer[SIZE];
int bytes;
buffer[0] = ((pkt->IEEE_ADDR) >> 56);
buffer[1] = (pkt->IEEE_ADDR) >> 48;
buffer[2] = (pkt->IEEE_ADDR) >> 40;
buffer[3] = (pkt->IEEE_ADDR) >> 32;
buffer[4] = (pkt->IEEE_ADDR) >> 24;
buffer[5] = (pkt->IEEE_ADDR) >> 16;
buffer[6] = (pkt->IEEE_ADDR) >> 8;
buffer[7] = (pkt->IEEE_ADDR);
buffer[8] = (pkt->endpoint);
buffer[9] = pkt -> requestedAction;
buffer[10] = pkt->level;
buffer[11] = pkt-> wc;
buffer[12] = pkt->address_mode;
buffer[13] = pkt-> gID;
buffer[14] = pkt->sID;
buffer[15] = pkt->val1;
buffer[16] = pkt->val0;
buffer[17] = pkt->status;
bytes = write(cli_sockfd,buffer,sizeof(buffer));
}
问题是服务器正在接收两次数据,就像两个不同的数据包一样。第二个数据包主要包含垃圾。
我浏览过互联网,主要是与endianess相关的问题。但这不是问题,客户端和服务器也事先知道消息长度,只在服务器端接收数据两次。
任何人都可以建议我错过了吗?
我做了以下更改:
#define SIZE 18
在客户端和
#define RSIZE 18
在服务器端
及其工作 问题是使用sizeof(dsfeedbackPkt)来定义大小。
答案 0 :(得分:1)
我定义的SIZE等于sizeof(dsfeedbackPkt)
这就是你的问题。由于struct padding,struct可能是20个字节,而不是18。
将SIZE
更改为18,它应该有效。