2

私は構造を作成しました:

struct buffer
{
    string ProjectName ;
    string ProjectID ;
}

buffer buf;
buf.ProjectID = "212";
buf.ProjectName = "MyProj";

sendto メソッドを使用してこの構造体を送信するには、構造体を型キャストして、以下のように送り返します。

char *sendbuf = (char*)&buf;
sentbytes = sendto(sock,sendbuf,strlen(sendbuf),0,(sockaddr*)&their_addr,sizeof(their_addr));

しかし、構造体をキャストしているときにchar*、実際のデータの値が失われ、デバッグ中に sendbuf に他の値が含まれていることがわかります。

sendtoを使用して上記の構造を送信する方法を教えてください。

4

3 に答える 3

2

POD を使用して構造を作成する必要があります。文字列はそのように使用できるものではありません。代わりに、次のように宣言する必要があります

struct buffer
{
  char ProjectName[MAX_LENGTH_PROJECT_NAME+1];
  char ProjectID[MAX_LENGTH_PROJECT_ID+1];
};

編集:明確化、文字列にはヒープに割り当てられたメモリブロックへのポインタが含まれているため、その構造を送信しようとすると、実際には文字を送信していません。

于 2010-08-31T07:38:07.720 に答える
2

std::string動的に割り当てられたメモリにデータを保持します。std::string::c_strと を使用して取得できる各文字列と文字列の長さを別々に送信できますstd::string::size

于 2010-08-31T07:38:43.740 に答える
1

ネットワーク経由でデータを送信する場合は、marshall/unmarshallを使用することをお勧めします。C ++スタイルでは、送信可能なバッファへのストリーミングに「<</>>」を使用します。このようにして、送信する内容と送信方法(binary、text、xml、...)をより細かく制御できます。Boostにはシリアル化モジュールもあります。

于 2010-08-31T08:15:25.263 に答える