0

私が抱えている問題は、どういうわけか非常に具体的です。

リンクを介して C でスライディング ウィンドウ プロトコルを実装する必要があります。私の senter.c ファイルは、速度、遅延、および失われたファイルまたは破損したファイルの割合をパラメーターとして受け取ります。データはリンク経由で送信されます。これは学校の課題なので、リンクの実装の詳細はわかりませんが、送信者と受信者はポートと IP を使用してリンクを開始する必要があるため、ソケットを使用していると思います。とにかく、タイムアウトと制御フローに使用するために、接続パラメーターを受信者に送信しようとしています。以下を使用して、速度と遅延を表す 2 つの int を送信するデータ フレーム ペイロードを作成します。

int s = (int)(*speed - '0'); int d = (int)(*delay - '0'); sprintf(t.payload,"%d%d",s,d);

送信者ファイルの s 変数と d 変数を出力すると、結果は 1,1 になり、これは正しいです。その後、結果のペイロアをレシーバーに送信します。ここで、ペイロード [0] は速度と呼ばれる別の int 変数に割り当てられ、ペイロード [1] は遅延と呼ばれる別の int に割り当てられます。問題は、ここでは値が 49 であり、本来あるべき値ではないことです。それらに atoi() 関数を使用してみましたが、速度が 11 に変換されている間に遅延が 1 に正常に変換され、意味がありません。私はそれを機能させるためにさまざまな方法を試しましたが、それらを文字として送信し、受信側で変換しても役に立ちませんでした。

何か案は?

PS: 巨大な投稿と私の英語の間違いで申し訳ありません!

4

1 に答える 1

1

「t」は構造体変数で、ペイロードは文字配列であると想定しています。2 つの数値を char 配列として送信しています。ある種の策略なしに、それらを char* から整数に戻すことはできません。たとえば、ペイロードが「12345」の場合、反対側から送信した 2 つの正しい番号を抽出するにはどうすればよいでしょうか? あなたが知っているのは、「12345」が2つの数字の連結であることだけです. (1,2345) または (12,345) または (1234, 5)... などです。

send コマンドを 2 回実行し、それに応じて受信することをお勧めします。お気に入り:

char str[10]; //a temporary variable

sprint(str,"%d", speed);
send (.......); //receive just delay alone on the other side

sprint(str,"%d", delay);
send(........);

別の方法として、文字を識別子として挿入し、数値を抽出するときにトークン化 (strtok) することもできます。お気に入り:

sprint(t.payload, "%dZ%d",speed, delay); //sender side
/* Here 'Z' is used as a delimiter */

受信側:

char *tok, *str;

receive(str, ....);

tok=strtok(str,"Z");
speed = atoi(tok);
tok=strtok(NULL);
delay=atoi(tok); 

2 つ以上の番号を送信する場合は、それに応じて strtok と 'Z' の挿入に注意してください。

于 2012-03-22T12:00:20.230 に答える