に問題があり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);
}