Соединение socket winapi черерз proxy server

Список бесплатных прокси можно взять например, при поиске в google.com ввести поисковый запрос free proxy list. Часто бывает, после того как вы взяли из Интернет список бесплатных прокси, многие из них не работоспособны. Для этого можно использовать следующий код на С++, который берет из текстового файла список прокси серверов, и в цикле программы проверяте на работоспособность каждый прокси из списка. Для упрощения примера сам цикл я приводить не буду, просто покажу как можно подключатся к серверу через прокси сервер, а подставлять нужные адреса прокси серверов и цикл вы сделаете сами.

//IP proxy address
char pszHostAddress[256];
strcpy(pszHostAddress,"216.220.165.62"
//IP proxy port
int nPort = 8080;

SOCKADDR_IN sockAddr;
ZeroMemory(&sockAddr, sizeof(sockAddr));
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons((u_short)nPort);
sockAddr.sin_addr.s_addr = inet_addr(pszHostAddress);

//get proxy IP if used dns name
if (sockAddr.sin_addr.s_addr == INADDR_NONE)
{
LPHOSTENT lphost;
lphost = gethostbyname(pszHostAddress);
struct sockaddr_in adr;
memcpy(&adr.sin_addr,lphost->h_addr_list[0],lphost->h_length);
sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
}

//connect to proxy server
if(connect(m_hSocket, (PSOCKADDR)&sockAddr, sizeof(sockAddr))== INVALID_SOCKET )
{
printf("%s", "connect socket error!\n");
exit(0);
}

//for test our proxy IP take google server char szDestName[256];
strcpy(szDestName, "http://google.com");

LPHOSTENT lphost;
lphost = gethostbyname(szDestName);

struct sockaddr_in adr;
memcpy(&adr.sin_addr,lphost->h_addr_list[0],lphost->h_length);

char szDestIP[256];
strcpy(szDestIP, inet_ntoa(adr.sin_addr));

char szPort[256];
strcpy(szPort, 80);

char sBuf[256];
int nCmdLength;

sprintf(sBuf, "CONNECT %s:%s HEAD \/ HTTP\/1.0\r\n Host: %s\r\n\r\n",szDestIP,szPort,szDestName);
nCmdLength = strlen(sBuf);

send(m_hSocket, sBuf, nCmdLength, 0);

char pszBuf[256];
int nBuf=256;

int nData=recv(m_hSocket, pszBuf, nBuf, 0);
if(nData==0 || nData == SOCKET_ERROR)
{
printf("%s", "recv socket error!\n");
exit(0);
}

CString temp(pszBuf);
if(temp.Find("200 OK")!=-1)
{
printf("%s", "connect ok!\n");
}
else
{
printf("%s", "connect failed!\n");
}


Как видим из программы, все что нужно сделать для подключения через прокси используя socket winapi, это создать сокет с адресом IP и номером порта прокси сервера, затем подключится к этому сокету, и через него подключится к google.com (в нашем примере). т.е. послать команду send на этот прокси сервер:

send(m_hSocket, CONNECT 172.217.20.174:80 HEAD \/ HTTP\/1.0\r\n Host: google.com\r\n\r\n", nCmdLength, 0);

где nCmdLength длинна посылаемой строки. 172.217.20.174:80 это IP и номер порта сервера google.com.

после того как мы отправили команду CONNECT, следует прочитать ответ от прокси- сервера командой recv, и в строке ответа найти строковое выражение "200 OK" что значит успешное подключение.