Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2009, 11:51   #1
123321
 
Регистрация: 09.12.2007
Сообщений: 5
По умолчанию http клиент

Помогите чайнику в сетевом программировании.
Необходимо написать функцию которая скачивает web страницу с сайта в CString
123321 вне форума Ответить с цитированием
Старый 22.01.2009, 14:35   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Друг писал класс такой. Исходный код страницы записывается в файл.
CHTTP.h
Код:
#include <WinInet.h>
#pragma comment(lib,"wininet")

class CHTTP
{
public:
	CHTTP(LPCTSTR lpszServerName, LPCTSTR lpszTarget, int Method, LPCTSTR lpszFileName);
	CHTTP();
	~CHTTP();

public:
	// инициализация WinInet
	bool OpenInet(LPCTSTR lpszAgent);
	// создаёт подключение к серверу lpszServerName - имя сервера (ukr.net)
	bool Connection(LPCTSTR lpszServerName);

	void CloseOpenedInet();
	void CloseConection();
	// проверка на ошибку
	bool ChekError(bool bTest);
	DWORD m_dwLastError;
	HINTERNET m_hInternet;
	HINTERNET m_hConnection;
	HINTERNET m_hRequest;
	// уничтожить запрос
	void CloseRequest();
	// создание и отправка запроса
	bool SendRequest(LPCTSTR lpszVerb, LPCTSTR lpszTarget);
	// передача данных методом Get
	bool Get(LPCTSTR lpszTarget);
	// передача данных методом Post
	bool Post(LPCTSTR lpszTarget);
	// записать ответ на запрос в файл
	bool WriteRespToFile(LPCTSTR FileName);
	CFile *m_lpFile;
};
CHTTP.cpp
Код:
#include "HTTPWorck.h"

CHTTP::CHTTP(LPCTSTR lpszServerName, LPCTSTR lpszTarget, int Method, LPCTSTR lpszFileName)
: m_dwLastError(0)
, m_hInternet(NULL)
, m_hConnection(NULL)
, m_hRequest(NULL)
, m_lpFile(NULL)
{
	OpenInet(TEXT(""));
	Connection(lpszServerName);
	if (Method == 1)
	{
		Post(lpszTarget);
		WriteRespToFile(lpszFileName);
	}
	else
	{
		Get(lpszTarget);
		WriteRespToFile(lpszFileName);
	}
}

CHTTP::CHTTP()
: m_dwLastError(0)
, m_hInternet(NULL)
, m_hConnection(NULL)
, m_hRequest(NULL)
, m_lpFile(NULL)
{
}

CHTTP::~CHTTP()
{
	CloseRequest();
	CloseConection();
	CloseOpenedInet();
}

// проверка на ошибку
bool CHTTP::ChekError(bool bTest)
{
	if (bTest==false)
	{
		m_dwLastError = ::GetLastError();
	}
	return bTest;
}

// инициализация WinInet
bool CHTTP::OpenInet(LPCTSTR lpszAgent)
{
	if (m_hInternet == NULL)
	{
		m_hInternet = ::InternetOpen(lpszAgent,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
	}
	return ChekError(m_hInternet != NULL);
}

// создаёт подключение к серверу lpszServerName - имя сервера, например (ukr.net)
bool CHTTP::Connection(LPCTSTR lpszServerName)
{
	CloseConection();
	if (m_hConnection == NULL)
	{
		m_hConnection = ::InternetConnect(m_hInternet,lpszServerName,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,1);
	}
	return ChekError(m_hConnection != NULL);
}

// закрывает соединение с интернет
void CHTTP::CloseOpenedInet()
{
	if (m_hInternet)
	{
		::InternetCloseHandle(m_hInternet);
	}
	m_hInternet = NULL;
}

// закрывает подключение к определённому серверу, но не заканчивает работу с интернет
void CHTTP::CloseConection()
{
	if (m_hConnection)
	{
		::InternetCloseHandle(m_hConnection);
	}
	m_hConnection = NULL;
}
// уничтожить запрос
void CHTTP::CloseRequest()
{
	if (m_hRequest)
	{
		::InternetCloseHandle(m_hRequest);
	}
	m_hRequest = NULL;
}

// создание и отправка запроса
bool CHTTP::SendRequest(LPCTSTR lpszVerb, LPCTSTR lpszTarget)
{
	if (m_hConnection)
	{
		CloseRequest();
		m_hRequest = ::HttpOpenRequest(m_hConnection,lpszVerb,lpszTarget,NULL,NULL,NULL,INTERNET_FLAG_KEEP_CONNECTION,1);
	}

	if (m_hRequest)
	{
		BOOL bSendRequest = ::HttpSendRequest(m_hRequest,NULL,0,NULL,0);
		if (!bSendRequest)
		{
			CloseRequest();
			CloseConection();
			CloseOpenedInet();
		}
	}
	return ChekError(m_hRequest != NULL);
}

// передача данных методом Get
bool CHTTP::Get(LPCTSTR lpszTarget)
{
	return SendRequest(TEXT("GET"),lpszTarget);
}

// передача данных методом Post
bool CHTTP::Post(LPCTSTR lpszTarget)
{
	return SendRequest(TEXT("POST"),lpszTarget);
}

// записать ответ на запрос в файл
bool CHTTP::WriteRespToFile(LPCTSTR FileName)
{
	if (m_hRequest)
	{
		char Data[2048];
		DWORD dwBytesRead = 0;
		
		BOOL bReadResponse = ::InternetReadFile(m_hRequest,Data,sizeof(Data)-1,&dwBytesRead);
		if (bReadResponse)
		{
			m_lpFile = new CFile();
			m_lpFile->Open(FileName,CFile::modeCreate | CFile::modeWrite);
			while (dwBytesRead!=0)
			{
				m_lpFile->Write(Data,dwBytesRead);
				bReadResponse = ::InternetReadFile(m_hRequest,Data,sizeof(Data)-1,&dwBytesRead);
			}
			m_lpFile->Close();
			delete m_lpFile;
		}
		else
		{
			return false;
		}
	}
	return ChekError(m_hRequest != NULL);
}
Все откоментировано, так что должны разобраться.
MaTBeu вне форума Ответить с цитированием
Старый 22.01.2009, 16:51   #3
123321
 
Регистрация: 09.12.2007
Сообщений: 5
По умолчанию

Спасибо, завтра попробую
123321 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HTTP запросы KAKTYC PHP 23 01.10.2008 10:14
http-запрос Черничный Работа с сетью в Delphi 1 22.08.2008 10:57
http.Get Domovoy Работа с сетью в Delphi 2 21.11.2007 18:37
Клиент-сервер-клиент Кронос Работа с сетью в Delphi 3 24.08.2007 07:57
http клиент в Delphi Alar Работа с сетью в Delphi 11 21.03.2007 00:43