通过C套接字发送结构

时间:2015-10-16 08:18:51

标签: c sockets tcp

我正在使用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)来定义大小。

1 个答案:

答案 0 :(得分:1)

  

我定义的SIZE等于sizeof(dsfeedbackPkt)

这就是你的问题。由于struct padding,struct可能是20个字节,而不是18。

SIZE更改为18,它应该有效。