Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
6
Добавлен:
01.05.2014
Размер:
9.83 Кб
Скачать

/* Пример реализации простейшего клиента 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;
}



Соседние файлы в папке HTTPClient
  • #
    01.05.20149.83 Кб6HTTPClient.cpp
  • #
    01.05.20144.37 Кб6HTTPClient.dsp
  • #
    01.05.2014545 б6HTTPClient.dsw
  • #
    01.05.201458.37 Кб6HTTPClient.ncb
  • #
    01.05.201448.64 Кб6HTTPClient.opt
  • #
    01.05.20141.2 Кб6HTTPClient.plg