
17.06.2009, 21:20
|
|
Постоянный
Регистрация: 25.03.2008
Сообщений: 670
С нами:
9541766
Репутация:
2407
|
|
Как вариант - использовать не keep-alive соединение, а close. Протокол надо использовать HTTP/1.0, а не 1.1, иначе придется парсить содержимое, так как сервер может отсылать его в этом случае кусками с Transfer-Encoding: chunked. Кстати, в файл надо писать не просто строку buff с помощью fputs, так как последний байт у нее необязательно нулевой, а следует использовать fwrite и явно указывать размер записываемого буфера.
Примерно так:
PHP код:
#define PORT 80
#define SERVERADDR "forum.antichat.ru"
#include "stdio.h"
#include <winsock2.h>
int myconnect()
{
WSADATA wd;
char buff[256] = {0};
char *buff2="GET / HTTP/1.0\r\nHost: forum.antichat.ru\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept-Language: ru,en-us;q=0.7,en;q=0.3\r\nConnection: close\r\nContent-length: 0\r\n\r\n\n";
printf ( "TCP Client \n" );
if ( WSAStartup ( 0x0101, &wd ) )
{
return 0;
}
SOCKET sock ;
sock=socket ( AF_INET, SOCK_STREAM, 0 );
if ( sock < 0 )
{
return 0;
}
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons ( PORT );
HOSTENT *hst;
if( inet_addr(SERVERADDR) != INADDR_NONE )
dest_addr.sin_addr.S_un.S_addr = inet_addr(SERVERADDR);
else if( hst=gethostbyname ( SERVERADDR ) )
( ( unsigned long * ) &dest_addr.sin_addr )[0]=((unsigned long** )hst->h_addr_list)[0][0];
else
{
closesocket( sock ) ;
WSACleanup();
return 0;
}
if(connect( sock, (sockaddr *)&dest_addr, sizeof(dest_addr) ))
{
return 0;
}
send( sock, buff2, strlen(buff2)-1, 0);
int x = 255;
FILE * ff = fopen("log.txt","w");
while (x>0)
{
x = recv( sock, buff, 255, 0 ); // 256 - buffer size
printf("Got %u bytes\n",x);
fwrite(buff,1,x,ff);
}
printf("finished\n",x);
closesocket( sock ) ;
WSACleanup();
fclose(ff);
return 1;
}
int main()
{
myconnect();
return 0;
}
Последний раз редактировалось d_x; 17.06.2009 в 21:25..
|
|
|