2012-08-24 6 views
6

Cでは作業コードがありましたが、なぜ機能するのか分かりませんでしたので、実際に何が起こっているのかを実際に理解できるように書き直しを開始しました。recv()の出力を保存するには?

これまでのところとても良い!私は書き直し、90%は今起こっていることすべてを理解している。しかし、問題は、recvdatabff)で受信したデータチャンクを私の事前に割り当てられたバッファ(htmlbff)に格納する方法がわかりません。

次のコード(など、それだけで基本を含んでいるので、例えばなしメモリの再割り当て、私はかなりこれを削っていることに注意してくださいまたは保護を漏らす...)考えてみましょう:あれば(そう

#define BUFFERSIZE 4096 
#define MAXDATASIZE 256 

char *htmlbff, databff[MAXDATASIZE]; 
int c, i = BUFFERSIZE, q = 0;   
if(!(htmlbff = malloc(i))) 
{ 
    printf("\nError! Memory allocation failed!"); 
    return 0x00; 
} 
while((c = recv(sock, databff, MAXDATASIZE, 0)) > 0) 
{ 
    /*memory checks stripped out since they are irrelevent for this post*/ 
    /*store data to the appropriate area in htmlbff*/ 
    q += c;   
} 

を私はこの権利を実行していると思います)。cは、現在のデータチャンクのサイズです。qは、これまでに受信したデータの総量です(qは、ループが繰り返されるたびにcだけインクリメントされます)。現時点では、私はメモリ処理のためにqを使用していますが(誰かが不思議に思っていた場合に備えて)、この問題の解決策にも目的があると私は信じています。

いずれにせよ、私が求めている質問は、2番目のコメントです。 recvのデータをhtmlbffに正しく保存するにはどうすればよいですか?

答えて

2

使用memcpy、およびオフセットhtmlbffqによって:

memcpy(htmlbff + q, databff, c); 

ことはでき同様recv直接htmlbffへ:

c = recv(sock, htmlbff + q, MAXDATASIZE, 0)); 

しかし、それは別のバッファを維持するために罰金だし、あなたの完全なコードに応じて、物事をより明確にするかもしれない。

BUFFERSIZEに対して小切手を追加して、htmlbffの範囲をコピーしないようにしてください。 reallocの処理を取り除いたとおっしゃったので、すでにこれを処理しています。私は各チャンクdatabffの即ちサイズの大きさを示すためにBUFFERSIZEを使用するデータをバッファする際

あなたの定数名は、少し混乱しています。

+0

を呼び出します。私は今、バッファを使用してスキップし、htmlbffに直接書き込むことができるので、これは最も有用であることがわかりました。 –

5

memcpy()を使用してhtmlbffにデータをコピー(追加)しますが、htmlbffのサイズを超えないようにする必要があります。 BUFFERSIZEバイトを受信したときにデータ受信を停止するか、realloc()を使用してhtmlbffにさらにデータを格納してください。例えば

:recvのはdatabffにデータを読み込むよう

char* htmlbff; 
size_t htmlbff_size = BUFFERSIZE; 
htmlbff = malloc(htmlbff_size); 

if (htmlbff) 
{ 
    while((c = recv(sock, databff, MAXDATASIZE, 0)) > 0) 
    { 
     if (c + q > htmlbff_size) 
     { 
      htmlbff_size *= 2; /* Arbitrary doubling of size. */ 
      char* tmp = realloc(htmlbff, htmlbff_size); 
      if (tmp) 
      { 
       htmlbff = tmp; 
      } 
      else 
      { 
       /* memory allocation failure. */ 
       free(htmlbff); 
       htmlbff = 0; 
       break; 
      } 
     } 
     memcpy(htmlbff + q, databff, c); 
     q += c; 
    } 
} 
+0

非常にうれしい、ありがとう、それはまさに私が自分の記憶を管理していることを除いて、ループの終了時に必要なバイト数を正確にバッファのサイズをreallocする別のステップを追加したことを除いて。もう一度あなたの答えをありがとう。 –

1

(データはソケットがMAXDATASIZEを超えて読み取る場合)あなたはすべてのデータを合わせて、バッファを拡大/再割り当てておく必要があるが、そのように=あなたのhtmlbffはメモリ内で大きくなり、新しい読み込みをhtmlbff全体に追加することができます。

qとcは、あなたがどこにいるのか、どこまで移動する必要があるのか​​を把握するためのカーソルのようなものです。あなたはそれをより多くの処理を行う必要がある場合を除き、私はどうなるのか

memcpy(htmlbff+q, databff, c); //Do this in your whle loop to append the data 
2

は、直接htmlbffrecv()データです。別のrecv()のための部屋が常にあるようにi - q未満MAXDATASIZEとき

は必ずrealloc()htmlbffことを確認してください。

次に、あなたが、私は本当にこの答えのようありがとうrecv(sock, htmlbff + q, MAXDATASIZE, 0)

関連する問題