0

に問題がありrecvます。構造体にデータを格納する関数と、ソケットから読み取ったデータの長さ (バイト単位) を作成しました。

テストのためにstdout、 によって読み取られた合計バイト数に基づいて、データをバイトごとに出力していますrecv。何らかの理由で、クエリしているサイトによっては、読み取られるバイト数が正しい場合と正しくない場合があります。たとえば、次のコードは一部のサイトで意図したとおりに機能します。

data->data_sz = 0;
while((i = recv(sock, data->data + data->data_sz, CHUNKSIZE, 0)) > 0)
{
    data->data_sz += i;
    if(databff - data->data_sz < CHUNKSIZE)
    {
        databff *= 2;
        if(!(tmp = realloc(data->data, databff)))
        {
            free(data->data);
            (void) WSACleanup();
            return 0;
        }
        data->data = tmp;
    }
}
i = strsbstr(data->data, "\r\n\r\n") + 4;                   //i = the position of the first char after header info  
if(i >= 0)  
{
    data->data_sz = data->data_sz - i;                      //data->data_sz = number of bytes without header info
    memmove(data->data, data->data + i, data->data_sz);
    if(!(tmp = realloc(data->data, data->data_sz)))
    {
        free(data->data);
        (void)WSACleanup();
        return 0;
    }
        data->data = tmp;                       
    }
    else
    {
        free(data->data);
        (void) WSACleanup();
        return 0;
    }
    return 1;
}

データを出力するstdoutには、for ループを使用します。

//t_html->data_sz points to my data->data_sz structure
//t_html->data points to my data->data structure
for(i = 0; i <= t_html->data_sz; i++) (void)fputc((int)t_html->data[i], stdout);

上記のコードは、一部のサイトでは機能しますが、他のサイトでは失敗します (たとえば、クエリhttp://www.google.comを実行すると、最終的な文字が期待されます</html>が、取得されます</html>l)。

基本的に私の問題は、data->data_sz(受信したバイト数)が正しく計算されていないため、収集したデータを正しく使用できないことです。私は今何をすべきか本当に途方に暮れています。

編集:strsbstr上記のコードで呼び出される関数は次のとおりです。

int strsbstr(const char *str, const char *sbstr)
{
    char *sbstrlc;

    if(!(strcmp(str, sbstr))) return 0;
    if(!(sbstrlc = strstr(str, sbstr))) return -1;
    return (int) (sbstrlc - str);
}
4

1 に答える 1

1
  1. recv(sock, data->data + data->data_sz, CHUNKSIZE, 0)問題になる可能性があります。なんで?CHUNKSIZEバッファに余裕がない可能性があるためです。実際、あなたは去っています (が のサイズに割り当てられているとdatabff - data->data_sz仮定します)。それはすべてとの初期値に依存しますが、これはわかりませんので、念のため指摘しておきます。datadatabffdatabffCHUNKSIZE
  2. データが NULL 文字で終了することは保証されていません。あなたの印刷ループはi <= t_html->data_sz;、どちらが間違っているかを示しています。である必要がありますi < t_html->data_sz;。を使用する<=と、バッファを超えてアクセスしているため、奇妙な文字が表示される場合と表示されない場合があります。
于 2012-11-14T21:02:25.853 に答える