2015-10-16 72 views
0

我对C. 编写使用TCP套接字客户端服务器应用程序用于将数据写入到服务器我送的结构是这样的:对C座发送结构

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

收到的第一个数据包的大小是否小于SIZE? – usr2564301

+0

什么是“尺寸”? –

+0

向我们展示您发送和接收数据的实际代码。 –

回答

1

我定义尺寸等于的sizeof(dsfeedbackPkt)

就在这里是你的问题。由于结构填充,结构可能是20字节,而不是18.

SIZE更改为18,它应该工作。

+0

我将它改为'#define SIZE 18',但是我仍然收到相同的错误 –

+0

剩下的问题不在您迄今发布的代码中。您能否将发送/接收代码添加到您的问题中?另外,你是否在代码的其他地方向套接字“写入”? –

+0

谢谢!我使用sizeof在服务器端保存了接收数据包的大小,我在服务器端也做了相同的更改,现在它的工作正常...... –