2015-10-16 106 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在服務器端保存了接收數據包的大小,我在服務器端也做了相同的更改,現在它的工作正常...... –