2012-03-05 19 views
0

私はツールNCTUnsで作業しています。ここではsendto関数を介して構造体を送信しています。関数SENDTOでソケット(C++)を介して構造体を送信し、RECVFORMで受信しましたが、常にガベージ値がいくつかあります。

私の構造 -

struct agentClientReportStatus{ 
u_int32_t  type; 
u_int32_t  nid; 
double   timeStamp; 
int   flag; 
u_int32_t  moreMsgFollowing; 
double   x; 
double   y; 
double   x1; 
double   y1; 
double   acceleration; 
double   speed; 
double   direction; 
int   TTL; 
int   seqNum; 
}  

と機能がある -

n = sendto(myUDPsockfd, msg, sizeof(struct agentClientReportStatus), 0, (struct sockaddr *) &cli_addr, len); 
n = recvfrom(myUDPsockfd, (char *)&msg, sizeof(struct agentClientReportStatus), 0, (struct sockaddr *) &cli_addr, &len); 

私はその与え、正しい出力をいくつかの値を印刷するときのセクションを送信するには。 しかし、受信側ではガベージ値を取得しています。シリアライズせずに送信することは可能ですか?もしそうでなければ、どうやってシリアライゼーションをするのですか?

msgは - agentClientReportStatus * msgです。 msg =新しいagentClientReportStatus;

+1

あなたは 'data'という名前の構造体について話していますが、この関数は' agentClientReportStatus'を記述しています。説明できますか ? –

+0

そして、 'msg'がどんなタイプで、どのように割り当てられているのかを知る必要があります。タイプ 'data *'の 'msg'はありますか? –

+0

[C++ミドルウェアライター](http://webebenezer.net)は、シリアライゼーションに役立つ可能性があります。 uint32_tをサポートしています。 –

答えて

1

受信機は

  • 異なるメモリ位置合わせ
  • 異なるエンディアン(エンディアンに対処するための有用な機能がhtonlntohlと似ている)
  • 標準C型

の異なるサイズを有することができますので、答え - はい、あなたはシリアル化を使用する必要があります

+0

ごめんなさい、私の構造名は "agentClientReportStatus"です。 – shefali

+0

私はここで放送したい、それは同じマシン上にあります。シリアル化が必要ですか? @darkmist – shefali

+1

シリアル化しないことは、悪用される習慣です。たとえば、次のバージョンのコンパイラで構造体パディング規則が変更され、送信者は再コンパイルされますが受信者は再コンパイルされないとします。 –

関連する問題