Прокси. Описание протокола.
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Прокси. Описание протокола. - 2009-08-16 21:17:05.153333
|
|
|
Zmaster
Сообщений: 930
Оценки: 0
Присоединился: 2007-02-09 19:02:43.500000
|
Добрый день. Не люблю создавать топики, но не осталось выбора. Расскажите мне пожалуйста (или дайте ссылку) протокол работы прокси-сервера. Например, мне программно нужно послать сообщение "helo" серверу smtp.yandex.ru на 25 порт через прокси-сервер. Каким образом в этом случае нужно общаться с прокси-сервером? Какие сообщения ему отсылать? Как принять ответ от яндекса? Будьте добры, расскажите.
|
|
|
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 порты сответственно). Где порт указывать?
|
|
|
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->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->h_addr)));
char *p = ip;
int i, j = strlen(ip), k=4;
for(i = 0; i<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->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->h_addr)));
int j = strlen(ip), k=4;
char *p = ip;
for(i = 0; i<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.
|
|
|
RE: Прокси. Описание протокола. - 2009-08-20 16:10:45.526666
|
|
|
Zmaster
Сообщений: 930
Оценки: 0
Присоединился: 2007-02-09 19:02:43.500000
|
Код это конечно лишнее, работать с сокетами в Windows я умею. Но в любом случае спасибо, в том числе и за эту строчку: quote:
З.Ы через http прокси не подключ. к smtp….. etc.
|
|
|
|
|