Показать сообщение отдельно

  #5  
Старый 17.06.2009, 21:20
d_x
Постоянный
Регистрация: 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..
 
Ответить с цитированием