3

サーバーとクライアントの2つの異なるマシンにC構造体があります。例えば:

struct account {
   int account_number;
   char *first_name;
   char *last_name;
   float balance;
};

私の質問は、マシン間でデータを複製するための可能な方法は何ですか?たぶん私はデータをXMLに変換してコピーすることを試みることができますか?または、配列を使用できますか?

4

2 に答える 2

1

最も単純で最も軽量なソリューション(2台のマシン間でaの形式で接続を開いている場合)は、一方の端でFILE*送信しfprintf、もう一方の端でデコードするfscanfことです。

protocol.h:

typedef struct _packet packet_t;

struct _packet {
  int account_number;
  char *first_name;
  char *last_name;
  float balance;
};

static const char packet_fmt[]=" acct: %d fname: %s sname: %s balance: %f";

送信者:

  ...
  printf(packet_fmt, acct, "Greg", "Benison", bal);
  ...

リスナー:

...
int n_read = fscanf(fin, packet_fmt, &acct, fname, sname, &balance);

if (n_read == 4)
  printf("Received balance update for %s %s: %f\n", fname, sname, balance);
...

4フィールド構造体にはこれで十分かもしれませんが、構造体が大幅に変化または拡大すると予想される場合は、XML、JSON、またはその他のより正式なエンコーディングを追求するのが理にかなっています。

于 2012-06-16T23:11:17.867 に答える
1

Cに精通している場合は、TCPソケットを使用してデータを送受信します。基本的に、データを生のバイトとして指定された順序で送信し、受信時にデコードできるようにする必要があります。マシンの拡張性を考慮に入れる必要があります。また、可変長の名前の長さを指定するためにデータの追加フィールドを送信する必要があります(受信するバイト数がわかるように)。通常、送信するデータパケットの合計サイズを示すフィールドを追加することをお勧めします。基本的に、データパケットは任意の方法でエンコードでき、もう一方の端で同じ方法で解凍すると、データが転送されます。たぶんこれは物事を行うための古い方法ですが、私はマシン間でデータを転送するために私の日常の仕事で常にこのアプローチを使用しています。それはあなたが利用できる多くのオプションの1つです。他の形式のxmlとしてデータを送信することもできますが、生のバイトを送信するとパケットが小さくなります(これは対処する必要のある問題である場合とそうでない場合があります)。お役に立てれば。

于 2012-06-16T23:19:04.203 に答える