BOOL connectEx(SOCKET sockConnect, LPCTSTR lpszDestIP, int nDestPort, int nSocksVer , LPCTSTR lpszProxyIP , int nProxyPort )
{
BOOL bIPTypeIsDomain = 0;
SOCKADDR_IN saDest;
saDest.sin_family= AF_INET;
saDest.sin_port = htons((u_short)nDestPort);
saDest.sin_addr.S_un.S_addr = inet_addr(lpszDestIP);
if(saDest.sin_addr.S_un.S_addr == 0)
{
bIPTypeIsDomain = 1;
//socks4不支持域名解析
if(nSocksVer == 4)
return 0;
}
if(nSocksVer)
{
//代理服务器地址
sockaddr_in saProxy;
saProxy.sin_family=AF_INET;
saProxy.sin_port=htons(nProxyPort);
saProxy.sin_addr.s_addr=inet_addr(lpszProxyIP);
//连接代理服务器
connect(sockConnect, (LPSOCKADDR)&saProxy, sizeof(saProxy));
if(GetLastError()!=0)
return 0;
char szBuf[1024];
szBuf[1023]=0;
//发送socks命令
szBuf[0] = nSocksVer ;
szBuf[1] = 1;
szBuf[2] = 0;
if(sendBlock(sockConnect, szBuf, 3) ==0)
{
closesocket(sockConnect);
return 0;
}
int nRecv = 0;
nRecv = 1023;
if(recvBlock(sockConnect, szBuf, nRecv) == 0)
{
closesocket(sockConnect);
return 0;
}
if(nRecv == 0)
{
closesocket(sockConnect);
return 0;
}
if(szBuf[0] == nSocksVer && szBuf[1] == 0)
;
else
{
closesocket(sockConnect);
return 0;
}
//发送socks connect命令
szBuf[0] = nSocksVer;
szBuf[1] = 1;
szBuf[2] = 0;
if(bIPTypeIsDomain)//DOMAIN方式
{
szBuf[3] = 3;
szBuf[4] = strlen(lpszDestIP);
strcpy(szBuf+5, lpszDestIP);
memcpy(szBuf+5+szBuf[4], &(saDest.sin_port) , 2);
}
else//IP4方式
{
szBuf[3] = 1;
memcpy(szBuf+4, &(saDest.sin_addr.s_addr), 4);
memcpy(szBuf+8, &(saDest.sin_port), 2);
}
if(sendBlock(sockConnect, szBuf, 10)==0)
{
closesocket(sockConnect);
return 0;
};
nRecv = 10;
if(recvBlock(sockConnect, szBuf, nRecv) == 0)
{
closesocket(sockConnect);
return 0;
};
if(nRecv == 0)
{
closesocket(sockConnect);
return 0;
}
if(szBuf[0] == nSocksVer && szBuf[1] == 0)
return 1;
else
return 0;
}
else
{
connect(sockConnect, (LPSOCKADDR)&saDest, sizeof(saDest));
if(GetLastError() == 0)
return 1;
else
return 0;
}
return 0;
}