2012-03-22 1 views
0

問題は何とか非常に特殊です。スライディングウインドウプロトコルによるデータ変換、C

リンク上でCでスライディングウィンドウプロトコルを実装する必要があります。私のsender.cファイルは、速度、遅延、紛失または破損したファイルのパーセンテージをパラメータとして受け取ります。データはリンクを介して送信されます。これは学校の割り当てなので、リンクの実装の詳細はわかりませんが、送信者と受信者はポートとipとのリンクを確立する必要があります。ソケットを使用していると思います。とにかく、私はタイムアウトと制御フローのためにそれらを使用するためにコネクションパラメータを受信者に送信しようとしています。私が使用して速度と遅延を表す2つのint値を送信するデータフレームのペイロードを作成する:

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

Iが送信者ファイルでsおよびd変数を印刷するとき、結果が正確である1,1です。その後私は結果のペイロードをレシーバに送ります。ここで、payload [0]はspeedと呼ばれる別のint変数に割り当てられ、payload [1]はdelayという別のintに割り当てられます。ここで問題となるのは、ここでは値49でなくてはならないということです。私はatoi()functioを使ってみましたが、私がすると遅れは1に変換されますが、速度は11に変換されますが意味がありません。私はそれを動作させるために多くの異なる方法を試しました、それらを文字として送信し、受信側でそれらを変換することも役に立たなかった。

アイデア?

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

+0

これまでに試したことがあるコード(可能な場合は削除されましたが、データ型や制御フローを理解するために必要なもの)を表示できますか? –

答えて

1

私は 't'は可変変数であり、ペイロードは文字配列であると仮定します。 char配列として2つの数値を送信しています。何らかのトリッキーなことなしに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つの以上の番号を送信している場合は、それに応じて「Z」のはstrtokと挿入の世話をしています。