2017-03-01 13 views
0

私のCクライアントサーバープログラムには非常に奇妙な問題があります。クライアントサーバーCプログラムの受信値が一致しないuint8_tの送信

私はnet_send(uint8_t *buf)と呼ばれる機能を持っているとします。この関数は、クライアント側で使用されます。同様に私はクライアントからデータを受け取るnet_recv(void* buf)と呼ばれるサーバで機能を持っています。ものすごく単純。

問題は、サーバがchar配列としてprintfできないことです。クライアントマシンとサーバーマシンとそのコンパイラは8ビットのcharをサポートしています。

ここでは例:配列位置の

char name[1024]; 
name[0] = 'k'; 
name[1] = 'a'; 
name[2] = 'n'; 
name[3] = 'e'; 

、残りは0です。 Iは、サーバ側でこの

net_send((uint8_t*)name); 

ようnet_sendと呼ばれる、私はこのようなデータ受信:私はuint8_t受信アレイの最初のいくつかのASCIIの小数点以下の値をチェックする場合も同様

uint8_t buf2[1024]; 
net_recv(buf2); 
printf("%s\n", (unsigned char*) buf2); // prints NOTHING 

を、Iこれを見つける

buf2[0] ==> 4 // which is end-of-transmission character 
buf2[1] ==> 0 // null character 
buf2[2] ==> 'k' // actually an ASCII value for 'k' 
buf2[3] ==> 'a' // actually an ASCII value for 'k' 
buf2[4] ==> 'n' // actually an ASCII value for 'k' 
buf2[5] ==> 'e' // actually an ASCII value for 'k' 

なぜこの奇妙な動作ですか?何か案は? 最初の2文字を消去した後でも、char配列を印刷できません。 uint8_tcharの値に変換するために要素コピーを作成しても、char配列は印刷されません。また、string.hヘッダファイルからmemcpyを使用すると、char配列を取得できません。 char配列や文字列を取得できないため、サーバーでの処理はできません。

アイデア?または、受け取ったuint8_tをどのようにchar値に変換してchar配列として見えるかを指します。または、あなたは何が起こっていると思いますか?

乾杯、 K.バッファリングされたデータと

+1

実際の内容はどこにあるのですか?buf2 [2] 'からprintinを試してみましたか? –

+0

私はそれを言いました。私も新しいバッファを作成し、forループを使用して実際のコンテンツを1つずつコピーします。それでも新しいバッファには何も表示されません。奇妙な! – Khawar

+2

net_send関数は文字列を送信する前に長さのカウントを送信していることを確認します(必要な場合)、受信時にそれを処理する必要があります。net_sendのソースを投稿する – pm100

答えて

0

あなたが説明するように、あなたはこのことによって、印刷することができる必要があります:それは、その後動作しない場合はどちらかあなたがしている何かがあります

// Ensure that the data are terminated 
buf2[6] = 0; 

// print from the third byte 
printf("%s\n", (char*) buf2 + 2); 

を(サーバーの標準出力が、印刷されたデータを探している場所以外の場所にリダイレクトされているなど)、またはにはの内容が間違っています。あなたがデータの前に2バイト0x040x00を取得している理由については

、それは確かにnet_send()net_recv()で採用プロトコルの一部です。おそらくnet_recv()は、先行するメタデータのバイトを実際のデータの一部として提示できるという点で問題があります。あなたはnet_send()net_recv()の機能を提示していないので、それについて話すことはできません。

関連する問題