Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа 3 / HTTPClient / HTTPClient
.cpp
/* Пример реализации простейшего клиента HTTP */
#include "stdafx.h"
#include <stdexcept> //for std::runtime_error
#include <assert.h> //for assert()
#define POP3_PORT ((BYTE)80) /* порт сервера рорЗ */
#define POP3_BUFSIZ ((DWORD)100000) /* размер буфера */
// структура описания почтового сообщения
typedef struct
{
DWORD num; // номер сообщения на сервере
DWORD size; // размер сообщения в байтах
} MSG_lNFO;
sockaddr_in srvaddr; // IP почтового сервера
char buf[POP3_BUFSIZ]; // буфер для принятия сообщений
char srv[]=TEXT("test.ru"); // доменноеимясервера
//char srv[]=TEXT("ru.wikipedia.org"); // доменноеимясервера
char usr[100]; // имя пользователя
char pwd[100]; // пароль пользователя
char base64_fin[100]=TEXT("");
DWORD BASE64_INPUT = 3;
DWORD BASE64_OUTPUT = 4;
LPCSTR BASE64_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
const char* c_pszErrorInvalidParameter = "Invalid parameter";
unsigned long Base64Encode( void* dest, const void* src, unsigned long size )
{
if (!dest || !src)
throw std::runtime_error( c_pszErrorInvalidParameter );
///
LPBYTE pSrc = (LPBYTE)src;
LPBYTE pDest = (LPBYTE)dest;
DWORD dwSrcSize = size;
DWORD dwDestSize = 0;
while (dwSrcSize >= 1)
{
unsigned long dwBlockSize = __min( dwSrcSize, BASE64_INPUT );
assert( 1 <= dwBlockSize && dwBlockSize <= BASE64_INPUT );
// Encode inputs...
BYTE n1, n2 = 0, n3 = 0, n4 = 0;
switch (dwBlockSize)
{
case 3:
n4 = (pSrc[ 2 ] & 0x3f);
n3 = ((pSrc[ 2 ] & 0xc0) >> 6);
case 2:
n3 |= ((pSrc[ 1 ] & 0x0f) << 2);
n2 = ((pSrc[ 1 ] & 0xf0) >> 4);
case 1:
n2 |= ((pSrc[ 0 ] & 0x03) << 4);
n1 = ((pSrc[ 0 ] & 0xfc) >> 2);
break;
default:
assert( false );
}
pSrc += dwBlockSize;
dwSrcSize -= dwBlockSize;
// Validate...
assert( 0 <= n1 && n1 <= 63 );
assert( 0 <= n2 && n2 <= 63 );
assert( 0 <= n3 && n3 <= 63 );
assert( 0 <= n4 && n4 <= 63 );
// Padding...
switch (dwBlockSize)
{
case 1: n3 = 64;
case 2: n4 = 64;
case 3:
break;
default:
assert( false );
}
// 4 outputs...
*pDest++ = BASE64_TABLE[ n1 ];
*pDest++ = BASE64_TABLE[ n2 ];
*pDest++ = BASE64_TABLE[ n3 ];
*pDest++ = BASE64_TABLE[ n4 ];
dwDestSize += BASE64_OUTPUT; //4
}
return dwDestSize;
}
// функция вывода фатальных ошибок WinSock
int rep_wsafail()
{
printf ("WSA error=%d\n",WSAGetLastError());
ExitProcess(0);
return 0;
}
// функция выдачи сообщения о текущей операции
void report(bool role_srv, const char *msg)
{
printf("POP3 %s: %s",(role_srv)?("server"):("client"),msg);
}
// посылка запроса POP3 и получение ответа сервера
void pop_send(SOCKET sock)
{
report(false,buf); // выводнаэкрантекстазапроса
send(sock,buf,strlen(buf),0); // оправка запроса серверу
ZeroMemory(buf,POP3_BUFSIZ); // очистка буфера
recv(sock,buf,POP3_BUFSIZ,0); // получение ответа на запрос
report(true,buf); // выводнаэкранрезультатазапроса
}
// стадия аутентификации
bool pop_login(SOCKET sock)
{
sprintf(buf,"user %s\n",usr); // отправкакомандьГиЗЕК"
pop_send(sock);
sprintf(buf,"pass %s\n",pwd); // отправка команды "PASS"
pop_send(sock);
// если ответ положительный, то
// аутентификация прошла успешно
if (strcmp(buf,"+OK")>=0) return true;
return false;
}
/*
// функция получения почтового сообщения с сервера
// параметры:
// mi -указательнаструктуруописывающую
// сообщение (номер.размер)
// sock - сокет установленного соединения
int pop_retr(MSG_INFO *mi,SOCKET sock)
{
DWORD count=0; // количество принятых байт
char *ptr=buf,filename[BUFSIZ];
FILE *fmsg;
// если сообщение превышает максимальный размер // возврат флага ошибки
if(mi->size>=POP3_BUFSIZ) return false; // команда RETR
sprintf(buf,"retr %d\n",mi->num);
pop_send(sock);
// обнуление буфер
ZeroMemory(buf,POP3_BUFSIZ);
// чтение с сервера до тех пор, пока
// сообщение не будет получено целиком
while(count <mi->size)
{
count+=recv(sock,ptr,POP3_BUFSlZ-count,0);
ptr=buf+count;
}
// сохранение полученного собщения в файле
sprintf(filename,"msg__%04X.msg",mi->num);
fmsg=fopen(filename,"wb+");
fwrite (buf,1,count-3,fmsg);
fclose(fmsg);
// вывод информационного сообщения printf("Message %d stored in %s\n",mi->num,filename); retum count; }
// удаление всех сообщений с сервера и выход
// параметры:
// sock - сокет установленного соединения
// msgs - указатель на массив описателей сообщений
// num - количество сообщений
void pop_delete(SOCKET sock,MSG_INFO* msgs, int num)
for(int i=0;i<num;i++)
{ // команда DELE для каждого сообщения
sprintf (buf,"DELE %d\n",msgs[i].num);
pop_send(sock);
}
// выход, отключение от сервера
sprintf(buf, "QUIT\n"); pop_send(sock);
}
*/
// функция получения почты с сервера
bool pop_getmail(SOCKET sock)
{
return 0;
}
void check_mail(SOCKET sock)
{
// pop_login(sock);
// pop_getmail(sock);
printf("222222\n");
}
// установка соединения с почтовым сервером
int init_connection ()
{
WSADATA wsa;
hostent *he;
SOCKET sock;
// старт WinSock API
if (WSAStartup(MAKEWORD(2,0),&wsa))rep_wsafail();
if (!(sock=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,0,0,0))) rep_wsafail();
// получение адреса почтового сервера
if (!(he=gethostbyname(srv))) rep_wsafail();
ZeroMemory(&srvaddr,sizeof(sockaddr_in));
srvaddr.sin_addr.S_un.S_addr=*((DWORD*)he->h_addr);
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(POP3_PORT);
// соединение с серевером
SOCKET_ERROR==connect(sock,(sockaddr*)&srvaddr,sizeof(srvaddr)) && rep_wsafail();
int ch;
printf("\n\n");
//printf("0: input request\n");
printf("1: GET / HTTP/1.1/nHost: test.ru // pravilniy zapros\n");
printf("2: GET /goo.htm HTTP/1.1/nHost: test.ru // pravilniy zapros\n");
printf("3: HEAD / HTTP/1.1/nHost: test.ru // HEAD\n");
printf("4: OPTIONS / HTTP/1.1/nHost:test.ru // OPTIONS\n");
printf("5: GET / HTTP/0/nHost: test.ru // Bad Request\n");
printf("6: lalala // Method Not Implemented\n");
printf("7: GET /pass/index.htm HTTP/1.1/nHost: test.ru\nAuthorization: Basic PASS // Login to site\n");
printf("8:EXIT\n");
printf("option: ");
scanf ("%d",&ch);
printf("\n\n");
switch(ch)
{
case 0:
char str[100];
//gets(str);
scanf("%s",&str);
sprintf(buf,str);
//printf("\n\nstr= %s",str);
break;
case 1:
sprintf(buf,"GET / HTTP/1.1\nHost: test.ru\n\n\n"); // pravilniy zapros
break;
case 2:
sprintf(buf,"GET /goo.htm HTTP/1.1\nHost: test.ru\n\n\n");
break;
case 3:
sprintf(buf,"HEAD / HTTP/1.1\nHost: test.ru\n\n\n"); // HEAD
break;
case 4:
sprintf(buf,"OPTIONS / HTTP/1.1\nHost:test.ru\n\n\n"); // OPTIONS
break;
case 5:
sprintf(buf,"GET / HTTP/0\nHost: test.ru\n"); // Bad Request
break;
case 6:
sprintf(buf,"lalala\n"); // Method Not Implemented
break;
case 7:
printf("Login: ");
scanf ("%s",usr);
printf("Pass: ");
scanf ("%s",pwd);
//printf ("%s:%s",usr,pwd);
char base64[100];
//char base64_fin[100]=TEXT("test.ru");
strcpy (base64_fin, "");
char usrpwd[100];
sprintf(usrpwd,"%s:%s",usr,pwd);
//unsigned long Base64Encode( void* dest, const void* src, unsigned long size )
unsigned long d_size;
d_size = Base64Encode(base64, usrpwd, strlen(usrpwd));
strncat (base64_fin, base64, d_size);
//printf ("base:%s\n\n%d",base64_fin,d_size);
sprintf(buf,"GET /pass/index.htm HTTP/1.1\nHost: test.ru\nAuthorization: Basic %s\n\n\n",base64_fin); // Login to site
break;
case 8 :
return 1;
break;
}
//sprintf(buf,"GET / HTTP/1.1\nHost: test.ru\n"); // правильный запрос
//sprintf(buf,"GET / \nHost: test.ru\n");
//sprintf(buf,"GET / HTTP/0\nHost: test.ru\n"); // Bad Request
//sprintf(buf,"HEAD / HTTP/1.1\nHost: test.ru\n"); // правильный HEAD - нет ответа
//sprintf(buf,"HEAD / HTTxP/1.1\nHost: test.ru\n"); // НЕ правильный HEAD - ОК
//sprintf(buf,"UBEISEBYAOBSTENY\n"); // Method Not Implemented
//sprintf(buf,"OPTIONS\nHost:test.ru\n"); // Internal Server Error
//sprintf(buf,"OPTIONS * HTTP/1.1\n"); // правильный OPTIONS - нет ответа
//sprintf(buf,"GET http://test.ru/index.htm\n"); // WOW!!!
//sprintf(buf,"GET http://test.ru/goo.htm\n"); // WOW!!!
//sprintf(buf,"GET /wiki/HTTP HTTP/1.1\nHost: ru.wikipedia.org\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\nConnection: close");
//sprintf(buf,"GET / HTTP/1.1\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, applica-tion/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*\nAccept-Language: en-gb\nAccept-Encoding: gzip, deflate\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)\nHost: localhost\nConnection: Keep-Alive\n"); // отправкакомандьГиЗЕК"
pop_send(sock);
FILE *fmsg;
fmsg=fopen("out.htm","wb+");
fwrite (buf,strlen(buf),1,fmsg);
fclose(fmsg);
//SOCKET_ERROR==recv(sock,buf,1000,0) && rep_wsafail();
//report(true,buf);
// если соединение установлено, работа с почтой
//if(strcmp(buf,"+OK")>=0)check_mail(sock);
closesocket(sock);
return 0;
}
int main(int argc, char* argv[])
{
while (!init_connection ()) {};
return 0;
}