我现在的情况是这样的:
在命令行里用ftp命令能连接到服务器上,但前提是IE的proxy开着,
当关掉IE的proxy后,是连不上的。现在我想实现这样的功能,关掉IE的proxy,我自己写一个基于socks4
的代理服务器,我该如何下手?之前我从没做过这方面的东西。另外哪位朋友有socks4的资料给我一份,非常感谢。
在命令行里用ftp命令能连接到服务器上,但前提是IE的proxy开着,
当关掉IE的proxy后,是连不上的。现在我想实现这样的功能,关掉IE的proxy,我自己写一个基于socks4
的代理服务器,我该如何下手?之前我从没做过这方面的东西。另外哪位朋友有socks4的资料给我一份,非常感谢。
你可以先自己下载一个winproxy或者Cproxy(这个更简单)装在本机上做测试用,也就是本身建一个代理服务器的环境。
通过代理服务器其实很简单,最主要的是连接代理服务器,一旦连接成功,则和没有代理一样。下面给你一个通过Socket连接socket4代理服务器的代码://代理服务器所用的结构体
struct sock4req1
{
char VN;
char CD;
unsigned short Port;
unsigned long IPAddr;
char other[1];
};
//代理返回的应答结构体
struct sock4ans1
{
char VN;
char CD;
};
/*********************************************/
//连接socket,直接返回socket
/*********************************************/
int connectsvr(char *szHostIp, int nPort)
{
if(szHostIp == NULL)
return -1;
struct in_addr ip_addr; if(strlen(szHostIp) >= 16)
return -1;
char ipaddr[16];
strcpy(ipaddr, szHostIp);
unsigned long lIp = inet_addr(ipaddr);
ip_addr.S_un.S_addr = lIp;
struct sockaddr_in destaddr;
memset((void *)&destaddr,0,sizeof(destaddr));
destaddr.sin_family = AF_INET;
destaddr.sin_port = htons(nPort);
destaddr.sin_addr = ip_addr;
unsigned long ul = 1;
int error=-1, len;
len = sizeof(int);
timeval tm;
fd_set set;
bool bret = false;
SOCKET sck = -1;
if(connect(sck,(struct sockaddr*)&destaddr,sizeof(destaddr)) == -1)
{
tm.tv_sec = 60;
tm.tv_usec = 20;
FD_ZERO(&set);
FD_SET(m_s, &set);
if(select(sck + 1, NULL, &set, NULL, &tm) > 0)
bret = true;
else
bret = false;
}
else
bret = true; if(!bret)
return -1;//表示连接不上服务器 unsigned long ul1= 0 ;
int ret = ioctlsocket(sck, FIONBIO, (unsigned long*)&ul1);
if(ret==SOCKET_ERROR)
return -1;//错误
return sck;
}
/*******************************************************/
//连接Socket4代理服务器
/*******************************************************/
int ConnectSocket4Proxy(char *szProxyIp, int nProxyPort, char *szHostIp, int nPort)//szHostIp是实际的目标IP地址
{
SOCKET sck = connectsvr(szProxyIp, NULL, 0, nProxyPort);//连接代理服务器
if(sck < 0)
return -1;
char buff[101];
memset(buff,0,101);
struct sock4req1 *proxyreq;
proxyreq = (struct sock4req1 *)buff;
proxyreq->VN = 4;
proxyreq->CD = 1;
proxyreq->Port = ntohs(nPort);
proxyreq->IPAddr = inet_addr(szHostIp);
send(m_s, buff, 9, 0);
struct sock4ans1 *proxyans;
proxyans = (struct sock4ans1 *)buff;
memset(buff,0,101);
recv(sck, buff, 100, 0);
if(proxyans->VN != 0 || proxyans->CD != 90)//代理服务器连接目标地址失败
{
closesocket(sck);
return -1;
}
return sck;
}