0

UDP ソケット経由で構造体を送信しようとしています。DRB_count の値は正しく受信しましたが、KenbStar の値を受信できませんでした。私は何を間違っていますか?私は同じマシンを使用しています。同じポートを持つクライアントとサーバーで IP 127.0.01 をループバックします。

クライアント:

typedef struct tseTargetCellInformation{
   UInt8 DRB_count;                     
   UInt8 *KenbStar;
}tTargetCellConfiguration;

trecTargetCellConfiguration *rx_TargetCellConfiguration_str;

rx_TargetCellConfiguration_str = (trecTargetCellConfiguration*)malloc(sizeof(trecTargetCellConfiguration));

send_TargetCellConfiguration_str->DRB_count=1;
send_TargetCellConfiguration_str->KenbStar = (UInt8*) malloc(1);
send_TargetCellConfiguration_str->KenbStar[0]= 0x5b;

sendto(sd, (char *) (send_TargetCellConfiguration_str), sizeof(tTargetCellConfiguration), 0, (struct sockaddr *)&server, slen)

サーバ:

typedef struct tseTargetCellInformation{
   UInt8 DRB_count;                     
   UInt8 *KenbStar;
}tTargetCellConfiguration;

rx_TargetCellConfiguration_str->KenbStar = (UInt8*) malloc(1);

recvfrom(sd, (char *) (rx_TargetCellConfiguration_str), sizeof(trecTargetCellConfiguration), 0, (struct sockaddr*) &client, &client_length);
4

2 に答える 2

2

KenbStarはポインターであるため、それが指す値を送信したり、値を受け取ったりするには、逆参照する必要があります。それ以外の場合は、ポインターを送受信するだけであり(つまり、ポイントされているコンテンツではない)、通常はまったく意味がありません (特にクライアントとサーバーが異なるプロセスである場合)。

つまり、次のようなものです。

sendto(sd, (char *) send_TargetCellConfiguration_str->KenbStar, sizeof(UInt8), ...

recvfrom(sd, (char *) rx_TargetCellConfiguration_str->KenbStar, sizeof(UInt8), ...

ただし、ポインターでなければならない特別な理由がない限りKenbStar、 のように通常のメンバーを作成するのがおそらく最も簡単でしょう。DRB_countその後、単一の呼び出しで構造体全体を送信 (および受信) することができます。

于 2013-03-01T11:40:36.810 に答える
0

あるメモリ空間から別のメモリ空間へのポインタを送信して、同じものを指すことを期待することはできません。特に、それが指しているものを送信していない場合はそうです。エンコードされていない構造体をネットワーク経由で送信することは、他の約10の理由からもノーノーです。XDRなどのいくつかのプレゼンテーションレイヤーを調査する必要があります。

于 2013-03-01T11:42:56.337 に答える