Помогите с получением Html файла/страницы

  • Автор темы Agrofyl
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

Agrofyl

#1
Здрасте. Хочу я скачать HTML страницу/файл. Вот так

Код:
#include <fstream>
#include <iostream>
#include <windows.h>
#include <time.h>
#include <string>
using namespace std;

#pragma comment( lib, "ws2_32.lib" )

int DownloadFile(char *charr) {

char link[1024]="";
strcpy(link, charr);

char host2[1024]="", path[1024]="", filename2[1024]="";

string str=(string)link;
int lastslash;
for(int i=0, nohost=1;i<=str.size(); i++) {
if(link[i]=='/') {
if(nohost) {
strncpy(host2, &link[0], i);
strncpy(path, &link[i], 1024);
nohost=0;
}
lastslash=i;
}
}
if(nohost) return 3;
strncpy(filename2, &link[lastslash], 1024);
if(filename2[0]=='/' && !filename2[1]) strcpy(filename2, "index.html");


struct sockaddr_in server;
struct hostent	*host = NULL;

SOCKET sDownload = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sDownload == INVALID_SOCKET)
{
MessageBox(0, "Не получается создать сокет.", 0, 0);
return 1;
}
server.sin_family = AF_INET;
server.sin_port = htons(80);
server.sin_addr.s_addr = inet_addr(host2);

if (server.sin_addr.s_addr == INADDR_NONE)
{
host = gethostbyname(host2);
if (host == NULL)
{
MessageBox(0, "Невозможно опеределить IP по имени...", 0, 0);
return 1;
}
CopyMemory(&server.sin_addr, host->h_addr_list[0],
host->h_length);
}
if (connect(sDownload, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
{
MessageBox(0, "Соединиться не получилось.", 0, 0);
return 1;
}
Sleep(1000);

char zapros[4096]="";
strcpy(zapros, "GET ");
strcat(zapros, path);
strcat(zapros, " HTTP/1.1\nHost: ");
strcat(zapros, host2);
strcat(zapros, "\nConnection: Keep-Alive\n\n");

char filename[1024]="";
strcpy(filename, "c:/");
strcat(filename, filename2);

ofstream file(filename, ios::trunc);
strcat(filename, ".header");
ofstream fileheader(filename);


int ret;
str=(string)zapros;
ret=send(sDownload, zapros, str.size(), 0);
if(ret == SOCKET_ERROR) return 1;

char getbuf[1];
int one=0, nowheader=1;
while(1) {
ret=recv(sDownload,	getbuf, 1, 0);
if (ret == SOCKET_ERROR) return 1;
if(ret == 0) break;
if(nowheader) {
fileheader.write(getbuf, 1);
if(getbuf[0]=='\n') {
if(one) {
nowheader=0;
fileheader.flush();
fileheader.close();
}
one=1;
}
else if(getbuf[0]!='\r') one=0;
}
else file.write(getbuf, 1);
}
file.flush();
file.close();

return 0;
}

int main() {
WSADATA wsd;

if(WSAStartup(MAKEWORD(2,2),&wsd) !=0) {
cout << "WinSock do not load!" << endl;
return 1;
}

char cha[]="localhost/test.html";
int i=DownloadFile(cha);
switch(i) {
case 0: {
cout << "Vse ok" << endl;
break;
}
case 1: {
cout << "System error" << endl;
break;
}
case 2: {
cout << "Error in create file" << endl;
break;
}
case 3: {
cout << "Error in link" << endl;
break;
}
}
return 0;
}
Но почему то вместо <html><body> получаю
<html>

<body>
Что то не допру, где ошибка.
Помогите, а.

З.Ы. За код не пинайте, я с С++ не так давно.
 
Статус
Закрыто для дальнейших ответов.