0

私はまだ C コーディングのスキルを磨いており、メモリを適切に管理する際に問題が発生し続けています。とにかく、私はソケットから読んでいますが、ソケットからの応答の合計の長さがバッファサイズより大きくない限り問題ありません。これは、着信データに十分な大きさのバッファー サイズを大きくすると、より大きなペイロードに対しても問題なく機能するためです。スタック上に非常に大きな「念のための」バッファを作成することは明らかに現実的ではないため、ヒープ上でバッファを動的に拡張したいと考えています。これが私が現在行っていることです:

raw_response = NULL;

// Receive from the Web server
retcode = recv(server_s, in_buf, BUF_SIZE, 0);

while ((retcode > 0) || (retcode == -1))
{
  totalLength += retcode;

  if (raw_response == NULL) {
    raw_response = (char*)malloc(sizeof(char)*totalLength);
    memcpy(raw_response, in_buf, totalLength);
  } else {
    raw_response = (char*)realloc(raw_response, sizeof(char)*totalLength);
    memcpy(raw_response+previousLength, in_buf, retcode);
  }

  previousLength = retcode;
  retcode = recv(server_s, in_buf, BUF_SIZE, 0);
  if (retcode == 0 || retcode == -1) {
    printf("\n\nNo more data, bailing. Data length was: %lu\n\n", totalLength);
  }
}

raw_response が NULL の場合、まだデータを受け取っていないことがわかっているので、malloc を使用します。それ以外の場合は、realloc を使用して、新しいバッファーを構築する必要がないようにします。代わりに、受信データを追加するだけです。したがって、最初の繰り返しの後に既存のデータの末尾を取得するには、raw_response のアドレスを取得し、それに以前の長さを追加し、そこに新しいデータを追加します。これは、後続の recv() の呼び出しごとに正しく追加されると想定しています。

問題は、BUF_SIZE を受信データの合計サイズよりも大きな値に変更しない限り、最終バッファーが常に破損することです。

おそらく私が見落としている単純なもののようです。何かご意見は?

4

1 に答える 1