Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Прокси. Описание протокола.

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Прокси. Описание протокола.
Имя
Сообщение << Старые топики   Новые топики >>
Прокси. Описание протокола. - 2009-08-16 21:17:05.153333   
Zmaster

Сообщений: 930
Оценки: 0
Присоединился: 2007-02-09 19:02:43.500000
Добрый день. Не люблю создавать топики, но не осталось выбора. Расскажите мне пожалуйста (или дайте ссылку) протокол работы прокси-сервера. Например, мне программно нужно послать сообщение "helo" серверу smtp.yandex.ru на 25 порт через прокси-сервер. Каким образом в этом случае нужно общаться с прокси-сервером? Какие сообщения ему отсылать? Как принять ответ от яндекса? Будьте добры, расскажите.
Post #: 1
RE: Прокси. Описание протокола. - 2009-08-17 19:32:00.163333   
Zmaster

Сообщений: 930
Оценки: 0
Присоединился: 2007-02-09 19:02:43.500000
Ага, нашел RFC для SOCKS 5, подкиньте пожалуйста еще SOCKS 4 и HTTP прокси (я понимаю, что для последнего общение происходит по протоколу HTTP, но мне нужны подробности)

//—————————————————–

В википедии нарыл краткое описание SOCKS 4. Думаю с ним сам разберусь. Расскажите теперь только о http-прокси. Вернее скачать страничку сайта через него я смогу. Но меня интересует как соединиться с сервером (smtp, pop3 например - 25, 110 порты сответственно). Где порт указывать?
Post #: 2
RE: Прокси. Описание протокола. - 2009-08-19 19:27:42.953333   
AnT1b1oT1k

Сообщений: 50
Оценки: 0
Присоединился: 2009-03-17 01:02:53.560000
SOCKET socks4(char *socks, int sockport, char *server, int srvport) { struct hostent *Ip = gethostbyname(socks); if(Ip == NULL) return 0; sockaddr_in sa; sa.sin_family = AF_INET; sa.sin_port = htons(sockport); sa.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)Ip-&gt;h_addr))); char pack[12]; pack[0] = 0x04; pack[1] = 0x01; pack[2] = srvport/256; pack[3] = srvport%256; Ip = gethostbyname(server); if(Ip == NULL) return 0; char ip[16]; strcpy(ip, inet_ntoa(*((struct in_addr *)Ip-&gt;h_addr))); char *p = ip; int i, j = strlen(ip), k=4; for(i = 0; i&lt;j; i++) if(ip[i] == '.') { ip[i] = 0; pack[k] = atoi(p); k++; p = ip+i+1; } pack[k] = atoi(p); pack[8] = rand()%255; pack[9] = rand()%255; pack[10] = rand()%255; pack[11] = 0x00; SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(s == SOCKET_ERROR) return SOCKET_ERROR; if(connect(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR) return SOCKET_ERROR; if(send(s, pack, 12, 0) == SOCKET_ERROR) return SOCKET_ERROR; i = recv(s, pack, 4, 0); if(i == 0 || i == SOCKET_ERROR) return SOCKET_ERROR; if(pack[1] == 0x5a) return s; return 0; } //====================================================================================// SOCKET socks5(char *socks, int sockport, char *server, int srvport) { struct hostent *Ip = gethostbyname(socks); if(Ip == NULL) return 0; sockaddr_in sa; sa.sin_family = AF_INET; sa.sin_port = htons(sockport); sa.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)Ip-&gt;h_addr))); SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(s == SOCKET_ERROR) return SOCKET_ERROR; if(connect(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR) return SOCKET_ERROR; if(send(s, "\x05\x01\x00", 3, 0) == SOCKET_ERROR) return SOCKET_ERROR; char pack[12]; int i = recv(s, pack, 2, 0); if(i == 0 || i == SOCKET_ERROR) return SOCKET_ERROR; if(pack[0] != 0x05 || pack[1] == 0xFF) return 0; pack[0] = 0x05; pack[1] = 0x01; pack[2] = 0x00; pack[3] = 0x01; Ip = gethostbyname(server); if(Ip == NULL) return 0; char ip[16]; strcpy(ip, inet_ntoa(*((struct in_addr *)Ip-&gt;h_addr))); int j = strlen(ip), k=4; char *p = ip; for(i = 0; i&lt;j; i++) if(ip[i] == '.') { ip[i] = 0; pack[k] = atoi(p); k++; p = ip+i+1; } pack[k] = atoi(p); pack[8] = srvport/256; pack[9] = srvport%256; if(send(s, pack, 10, 0) == SOCKET_ERROR) return SOCKET_ERROR; i = recv(s, pack, 10, 0); if(i == 0 || i == SOCKET_ERROR) return SOCKET_ERROR; if(pack[0] == 0x05 && pack[1] == 0x00) return s; return 0; } Сделай файл.h подключи к проекту юзать так:

WSADATA wsaData; if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) printf("Error at WSAStartup()\n"); SOCKET sock; sock = socks5(127.0.0.1, 1080, "smtp.mail.ru", 2525); recv(sock, rcvbuff, sizeof(rcvbuff) -1, 0); strcpy(sendbuff,"EHLO mail.ru\r\n"); //смотри что бы буффера хватило ) send(sock,sendbuff,strlen(sendbuff),0); recv(sock, rcvbuff, sizeof(rcvbuff) -1, 0); З.Ы через http прокси не подключ. к smtp….. etc.
Post #: 3
RE: Прокси. Описание протокола. - 2009-08-20 16:10:45.526666   
Zmaster

Сообщений: 930
Оценки: 0
Присоединился: 2007-02-09 19:02:43.500000
Код это конечно лишнее, работать с сокетами в Windows я умею. Но в любом случае спасибо, в том числе и за эту строчку:
quote:

З.Ы через http прокси не подключ. к smtp….. etc.
Post #: 4
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Прокси. Описание протокола.







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.