2012-02-29 5 views
0

プロセスは、値を入力した後にchar bufで送信することによって、PBに2つの整数の値を送信したいとします。 PAとPBが同じマシンにあるとします。 PBは、読み取るバッファに2つの整数の値が含まれていることを認識しています。IPC用のsprintfまたはitoaまたはmemcpy

uint x=1; 

uint y=65534; 
  • ケース1

sprintf(buff,"%d%d",x,y); 

Q1に示すように、PAは、チャーBUFに書き込む

- この場合には1とその値を抽出することができるPBする方法及び65534それ以来1,6,5,5,3,4を含む配列を持っています。 sprintfを使用していますか?

  • ケース2

PAバッファへの整数の値を移入しitoa関数を使用します。 PBはatoiを使用してバッファから値を抽出します。 itoaは、各値の後にヌルターミネータを挿入するので、これは可能でなければなりません。

Q2 - PAが4バイトのintサイズの32ビットマシンで実行され、PBが2バイトのintサイズを持つ16ビットマシンで実行されているとします。範囲外をチェックするだけで、自分のコードを移植可能にすることができますか?

Q3 - memcpyこれは別の方法ですか?

Q4 - これはどのようにして行われますか?

+0

宿題......? – thumbmunkeys

+1

人とコミュニケーションしていない限り、ASCIIを使用しないことをお勧めします。これは、データを表現する最もハードウェアに嫌なフォーマットです。 –

答えて

0

1)受信者はネットワークから文字列値を読み取り、それ自身の変換を行います。この場合、165,534の文字列表現が取得されます。受信側の値を区切る方法が必要です。

2)範囲外であることを確認するのは適切ですが、移植性は、転送のフォーマットを定義するなど、バイナリやテキストなど、より多くの要因によって異なります。

3)Wha?

4)通常は、数値のバイナリ表現の標準を決めることによって行われます。つまり、符号付き/符号なし16/32/64ビット値であり、それを一般にネットワークバイトオーダーと呼ばれるものに変換します。 [1]を受信側でホストバイトオーダに変換します。

[1] http://en.wikipedia.org/wiki/Network_byte_order#Endianness_in_networking

0

を私はあなたが持っていない場合は、バッファから値を抽出する方法がないケース1に気づいたとして、あなたは

に顔をしていることを示唆しています追加情報。だから、いくつかの限定的な性格が必要です。

Q2では、16ビットマシンについて言及しています。 intの#bytesだけでなく、endianessとsignも問題になります。私はどうなるのか

: -
または (あなたは16ビットマシンに4バイトのintを送信し、情報を失うことなく、同じタイプを使用することはできません)異なる数のための独自のプロトコルを定義します - int型をチェック(2バイトに収まる必要があります)。

こちらがお役に立てば幸いです。

0

Q1:使用していませんsprintfが問題ですが、それを使用する方法です。どの程度:

sprintf(buff,"%d:%d",x,y); 

(注:区切り文字としてコンマが国際形式で問題を引き起こす可能性があります)

Q2:いいえ。他の問題、例えばエンディアンに関しては、

Q3:異なるマシンを使用する場合は、いいえ。 1台のマシンで、バッファをバイト配列として使用することができます。

Q4:さまざまな方法、例。 XDR(http://en.wikipedia.org/wiki/External_Data_Representation)


+0

データが文字列形式で転送される場合、Endianessは問題にはなりません。 – Lundin

0

プロトコルとトランスポートメカニズムが必要です。

トランスポートメカニズムはソケット、名前付きパイプ、共有メモリ、SSLなど

を含めるあなたが示唆したように、プロトコルは、スペースで区切られた文字列と同じくらい簡単である可能性があります。 XMLベースのフォーマットのように、より複雑なものになる可能性もあります。またはバイナリ形式。 これらのプロトコルタイプはすべて、さまざまなアプリケーションで使用されています。どちらのプロトコルを選択するかは、要件によって異なります。

関連する問題