2016-04-03 9 views
-1

私はソケットを使用してC++を使用して、コンソールアプリケーションを作成し、サーバへのHTTP GETリクエストを送信したが、応答は私のバッファInfactは1000000より大きくHTMLファイルですよ:char buffer[1000000];が小さすぎます。 のサイズよりも大きいデータをサーバーから受信する必要があります。C++を使用してrecv()関数でビッグデータを受け取る方法は?

私はこのコードを使用しますが、より大きな応答を受け取る方法は何ですか?私は、コードとexplenationsおかげで私を助けてください、このプログラミングの分野で初心者だ:

char buffer[1000000]; 


    int nDataLength; 
    while ((nDataLength = recv(Socket, buffer, 1000000, 0)) > 0) { 
     int i = 0; 

     while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') { 
      myString += buffer[i]; 
      i += 1; 
     } 
    } 

    cout << myString << "\n"; 
+1

使用大きなバッファ.... – jpo38

+0

1000000 char配列 –

+0

何 'recv'リターンに許可最大サイズは?数字または 'SOCKET_ERROR'(-1)。小さなバッファは問題ではないはずです。あなたは 'recv'への呼び出しごとに部分的な答えを読んで、ある時点ですべてのデータを受け取るようにしてください。 'cout <<" recv returned "<< nDataLength << endl"をループの中に入れて、データを受け取ったかどうかを確認してください。 – jpo38

答えて

2

ソケットから読み取るときに、より小さい固定長のバッファを使用し、読み取ったデータを各ループ反復で動的に増加するバッファ(std :: stringやファイルなど)に追加する必要があります。 recv()は、実際に読み取られたバイト数を示しています。バッファにアクセスすると、それ以上のバイトにはアクセスしません。 jpo38うんしかし@

char buffer[1024]; 
std::string myString; 

int nDataLength; 
while ((nDataLength = recv(Socket, buffer, sizeof(buffer), 0)) > 0) { 
    myString.append(buffer, nDataLength); 
} 

std::cout << myString << "\n"; 
+0

あなたの助けてくれて..それは正しく動作します –

1

のrecvの戻り値は、recevedデータの合計サイズです。 合計データサイズを知ることができます。バッファが合計データサイズよりも小さい場合、2つのソリューションがあります。私は推測します... 1.ヒープ上にバッファを割り当てます。 (recv function return)

2番目のソリューションを使用することをお勧めします。 recv関数、ソケットプログラミングのサンプルコードについての概要。 それは役に立ちます。

+0

私のコードを変更するにはどうすればよいですか? @キムリョンギ –

関連する問題