Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
C++ и получение страницы по HTTP. |

17.06.2009, 21:27
|
|
Он хакер.
Регистрация: 01.11.2008
Сообщений: 1,756
Провел на форуме: 6462214
Репутация:
3171
|
|
C++ и получение страницы по HTTP.
Собственно недавно открыл учебник по C++, прочитал,показалось достаточно нетяжело,но вот возник вопрос по работе с сетью.А именно - получением информации по средству http.Статей для моего уровня знаний не нашол.
И так, нужен простейший код соединения с http и принятием информации.Тоесть.
url = "antichat.ru";
.....
и наприер в переменной content остаеться всен содержимое страницы.
Скрипт нужен только для изучения.Если нужны стоонние класы или библиотеки,пожалуйста с названием.И если таковая имееться - литература по ним.Спасибо.
|
|
|

17.06.2009, 21:31
|
|
Reservists Of Antichat - Level 6
Регистрация: 25.03.2008
Сообщений: 670
Провел на форуме: 4137635
Репутация:
2407
|
|
Посмотри темой ниже, только что там отписал)
https://forum.antichat.ru/thread125744.html
Насчет литературы - http://msdn.microsoft.com/en-us/library/ms741394(VS.85).aspx
Последний раз редактировалось d_x; 17.06.2009 в 21:37..
|
|
|

17.06.2009, 21:35
|
|
Участник форума
Регистрация: 08.02.2008
Сообщений: 116
Провел на форуме: 1608432
Репутация:
158
|
|
Код:
#include <windows.h>
#include <stdio.h>
#include <string.h>
#pragma comment(lib, "ws2_32.lib")
char* OpenURL(char *url) {
WSADATA lpWSAData;
SOCKET s;
// Проверим на правильность введенный адрес.
// Он должен начинаться с "http://"
if (memcmp(url,"HTTP://",7)!=0 && memcmp(url,"http://",7)!=0) return(NULL);
url+=7;
// Инициализация библиотеки Ws2_32.dll.
if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0) return(NULL);
// Получим имя хоста, номер порта и путь ----------------------------
char *http_host=strdup(url); // Имя хоста (HTTP_HOST)
int port_num=80; // Номер порта по умолчанию (HTTP_PORT)
char *http_path=NULL; // Путь (REQUEST_URI)
char *pch=strchr(http_host,':');
if (!pch) {
pch=strchr(http_host,'/');
if (pch) {
*pch=0;
http_path=strdup(pch+1);
}
else http_path=strdup("");
}
else {
*pch=0;pch++;
char *pch1 = strchr(pch,'/');
if (pch1) {
*pch1=0;
http_path=strdup(pch1+1);
}
else http_path=strdup("");
port_num = atoi(pch);
if (port_num==0) port_num = 80;
}
// Поучаем IP адрес по имени хоста
struct hostent* hp;
if (!(hp=gethostbyname(http_host))) {
free(http_host);
free(http_path);
return(NULL);
}
// Открываем сокет
s=socket(AF_INET, SOCK_STREAM, 0);
if (s==INVALID_SOCKET) {
free(http_host);
free(http_path);
return(NULL);
}
// Заполняем структуру sockaddr_in
struct sockaddr_in ssin;
memset ((char *)&ssin, 0, sizeof(ssin));
ssin.sin_family = AF_INET;
ssin.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr[0];
ssin.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr[1];
ssin.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr[2];
ssin.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr[3];
ssin.sin_port = htons(port_num);
// Выводим IP адрес хоста, с которым будем соединятся
printf("Conecting to %d.%d.%d.%d...",(unsigned char)hp->h_addr[0],
(unsigned char)hp->h_addr[1],
(unsigned char)hp->h_addr[2],
(unsigned char)hp->h_addr[3]);
// Соединяемся с хостом
if (connect(s, (sockaddr *)&ssin, sizeof(ssin))==-1) {
free(http_host);
free(http_path);
printf("Error\n");
return(NULL);
}
printf("Ok\n");
// Формируем HTTP запрос
char *query=(char*)malloc(2048);
strcpy(query,"GET /");
strcat(query,http_path);
strcat(query," HTTP/1.0\nHost: ");
strcat(query,http_host);
strcat(query,"\nUser-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
strcat(query,"\nAccept: */*\n\n");
// Выводим HTTP запрос
printf("%s",query);
// Отправляем запрос серверу
int cnt=send(s,query,strlen(query),0);
// Освобождаем память
free(http_host);
free(http_path);
free(query);
// Проверяем, не произошло ли ошибки при отправке запроса на сервер
if (cnt==SOCKET_ERROR) return(NULL);
cnt=1;
// Получаем ответ с сервера ---------------------------------
int size=1024*1024; // 1Mb
char *result=(char*)malloc(size);
strcpy(result,"");
char *result_ptr=result;
while (cnt!=0 && size>0) {
cnt=recv (s, result_ptr, sizeof(size),0);
if (cnt>0) {
result_ptr+=cnt;
size-=cnt;
}
}
*result_ptr=0;
// Деинициализация библиотеки Ws2_32.dll
WSACleanup();
return(result);
}
void main(void) {
char *result=OpenURL("http://www.antichat.ru/");
if (result) {
printf("%s",result);
free(result);
}
else {
printf("Error # WSABASEERR+%d\n",WSAGetLastError()-WSABASEERR);
}
getchar();
getchar();
}
|
|
|

17.06.2009, 21:38
|
|
Он хакер.
Регистрация: 01.11.2008
Сообщений: 1,756
Провел на форуме: 6462214
Репутация:
3171
|
|
Всем спасибо,совсем забыл про wins. 
|
|
|

17.06.2009, 21:46
|
|
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме: 6490435
Репутация:
2290
|
|
А нахрена юзать апи, когда есть классы-обертки? Количество кода сократится в десяток раз.
|
|
|

17.06.2009, 21:53
|
|
Участник форума
Регистрация: 03.02.2009
Сообщений: 104
Провел на форуме: 270228
Репутация:
70
|
|
afxinet.h ?)))
|
|
|

18.06.2009, 00:56
|
|
Он хакер.
Регистрация: 01.11.2008
Сообщений: 1,756
Провел на форуме: 6462214
Репутация:
3171
|
|
Сообщение от nerezus
А нахрена юзать апи, когда есть классы-обертки? Количество кода сократится в десяток раз.
Нер, нука подкинь почитать что нибудь про "классы обертки", я знаю у тебя все есть =)
|
|
|

18.06.2009, 01:03
|
|
Он хакер.
Регистрация: 01.11.2008
Сообщений: 1,756
Провел на форуме: 6462214
Репутация:
3171
|
|
Вот,люди,пока не забыл,задам наиглупейший но очень меня волнующий вопрос.
Как в C++ прорисовываеться интерфейс у программы под win32? Прописываеться кодом каждая кнопка и окошко Просто я недалеко зашел,но успел увидить,что привычной для меня в Dekphi панели кнопочек,окошечек,боксов - нет  С++ Игшдвук edbltk - tcnm?f d С++ (Visual) - нет =*(
|
|
|

18.06.2009, 01:19
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
в вижуал есть. только если ты делаешь на чистом win32 проекте без мфц, то это просто редактор. Если проект мфц - то код опять же упрощается. Выбираешь обрабатываемое событие или сообщение, добавляешь обработчик, указываешь, в какой класс засунуть обработчик и все. Но советую начать с обычных вин32 окошек. Ибо горе делфи не учит работе системы. Учит тока растянуть батон тут, клацнуть там.
Чтобы создалось простое окно делаешь в студии проект вин32 не емпти и не консольный. Открываешь меню view->resource view. Там в дереве dialogs и вперед. Основное окно создается на апи, эбаут создается на шаблоне из ресурсов. Основное окно тоже может быть из ресурсов и создаваться через DialogBox. Советую глянуть firststeps.ru так вроде были основы. И мсдн побольше читай
|
|
|

18.06.2009, 02:06
|
|
Он хакер.
Регистрация: 01.11.2008
Сообщений: 1,756
Провел на форуме: 6462214
Репутация:
3171
|
|
2Ra$cal.
на первыхшагах очень унылые и плоховатые уроки.Ничего не сбалансированно,объяснени все теоретические.Вот еслибы бы было чтото такое же,только получше сделанное - было бы отлично.А то книжка многое не объясняет,а про ГУИ я вооббще там ничего не нашол 
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|