Код:
#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();
}
|