0

文字のバイト配列に問題があります。TCPソケットを介してバイナリデータを転送するファイル転送プログラムを作成しています。したがって、チャンクからデータを取得するときは、それらを一時コンテナーに保存してから、データ全体を保持するためにどこかに追加する必要があります。std :: vectorを試しましたが、うまく機能しません(または間違って使用しています)。

size_t nbytes = 0;
char buffer[5]; //temporary container.
int result = 0;
std::vector<char> abc;

if (ioctl(sockfd, FIONREAD, (char*)&nbytes) < 0)
{
    printf("[-] Error getting available data.\n");
    return -1;
}
printf("[*] Bytes available: %lu\n", nbytes);

while(true)
{
    if(nbytes > sizeof(buffer))
    {
        result = recv(sockfd, buffer, sizeof(buffer), 0);
        for(int i = 0; i < result; i++)
        {
            abc.push_back(buffer[i]); //big data causes memory corruption.
        }
        nbytes -= result;
        continue;
    }
    else if(nbytes <= sizeof(buffer) && nbytes != 0)
    {
        result = recv(sockfd, buffer, nbytes, 0);
        for(int i = 0; i < result; i++)
        {
            abc.push_back(buffer[i]); //big data causes memory corruption.
        }
        break;
    }
    else
    {
        result = 0;
        break;
    }
}

printf("Data Received: %s", &abc[0]);
4

1 に答える 1

4

recv失敗した場合は戻りますがSOCKET_ERROR、チェックせず、代わりに受信したバイト数として使用します。dから-1と同様に、前のアドレスから効果的にSOCKET_ERROR読み取ります。#definebuffer

編集:その場合、ループがまったく実行されないため、元の答えが間違っていたことが判明しました。ただし、問題は、ベクトルのコンテンツがnullで終了していないため(文字列セマンティクスのないプレーンバッファであるため)、ガベージのように見えますが、実際には問題ありません。

于 2013-03-08T12:44:15.983 に答える