我现在的情况是这样的:
在命令行里用ftp命令能连接到服务器上,但前提是IE的proxy开着,
当关掉IE的proxy后,是连不上的。现在我想实现这样的功能,关掉IE的proxy,我自己写一个基于socks4
的代理服务器,我该如何下手?之前我从没做过这方面的东西。另外哪位朋友有socks4的资料给我一份,非常感谢。

解决方案 »

  1.   

    代理服务器有三种,一种是http代理,一种是socket4代理,再一种是socket5,socket5是需要用户名和密码认证的代理。
    你可以先自己下载一个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;
    }