这是我搞的一个关于代理服务器的程序,当然是网上找的,
我自己修改了其中的一部分,但是还是不对。如果那一位有http or sock4代理服务器的源程序请给我一份,万分感谢。

解决方案 »

  1.   


    #include "stdafx.h"
    #include "Proxy.h"
    #include <winsock2.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
     
    #define HTTP  "http://"
    #define FTP   "ftp://"
    #define PROXYPORT    5060     
    #define BUFSIZE    40960  
    CWinApp theApp;
                          
    using namespace std;UINT ProxyToServer(LPVOID pParam);
    UINT UserToProxyThread(LPVOID pParam);struct SocketPair
    {
    SOCKET  user_proxy;      
    SOCKET  proxy_server;     
    BOOL    IsUser_ProxyClosed;  
    BOOL    IsProxy_ServerClosed;  
    };
    struct ProxyParam
    {
    char Address[256];    
    HANDLE User_SvrOK;    
    SocketPair *pPair;  
    int     Port;         

    }; 
                      
    SOCKET    gListen_Socket;   int StartServer()
    {
         WSADATA wsaData;
     sockaddr_in local;
     SOCKET listen_socket; if(::WSAStartup(0x202,&wsaData)!=0)
    {printf("\nError in Startup session.\n");WSACleanup();return -1;}; local.sin_family=AF_INET;
    local.sin_addr.s_addr=INADDR_ANY;
    local.sin_port=htons(PROXYPORT); listen_socket=socket(AF_INET,SOCK_STREAM,0);
    if(listen_socket==INVALID_SOCKET)
    {printf("\nError in New a Socket.");WSACleanup();return -2;} if(::bind(listen_socket,(sockaddr *)&local,sizeof(local))!=0)
    {printf("\n Error in Binding socket."); WSACleanup();return -3; }; if(::listen(listen_socket,5)!=0)
    {printf("\n Error in Listen."); WSACleanup(); return -4;} gListen_Socket=listen_socket;  SOCKET  msg_Socket; while (1)
    {
    msg_Socket=SOCKET_ERROR;

       while (msg_Socket==SOCKET_ERROR)    msg_Socket=accept(gListen_Socket,NULL,NULL);             AfxBeginThread(UserToProxyThread,(LPVOID)msg_Socket);     } return 1;
    }int CloseServer()
    {
    closesocket(gListen_Socket);
    WSACleanup();
    return 1;
    }
      

  2.   


    int GetAddressAndPort( char * str, char *address, int * port)
    {
    char buf[BUFSIZE], command[512], proto[128], *p;
    int j;
    sscanf(str,"%s%s%s",command,buf,proto);
    p=strstr(buf,HTTP);
     
    if(p)
    {
    p+=strlen(HTTP);
    for(int i=0;i<strlen(p);i++)
    if( *(p+i)=='/') break;
    *(p+i)=0;
    strncpy(address, p, 255);
    p=strstr(str,HTTP);
    for(int j=0;j<i+strlen(HTTP);j++)
    *(p+j)=' ';  
    *port=80;  
    }
    else

     p=strstr(buf,FTP);
     if(!p) return 0;
      p+=strlen(FTP);
    for(int i=0;i<strlen(p);i++)
    if( *(p+i)=='/') break;      
         *(p+i)=0;
    for(j=0;j<strlen(p);j++)
    if(*(p+j)==':') 
    {
    *port=atoi(p+j+1);     
        *(p+j)=0;
    }
     else *port=21;                  strncpy(address,p,255);
    p=strstr(str,FTP); for(j=0;j<i+strlen(FTP);j++)
    *(p+j)=' ';
    }
    return 1; 

    UINT UserToProxyThread(LPVOID pParam)
    {
     char * Buffer = new char[BUFSIZE * 100];
     int  Len;
      
     SOCKET msg_socket=(SOCKET)(LPVOID)pParam;
     int  retval;
     SocketPair SPair;
     ProxyParam ProxyP;
     CWinThread *pChildThread;
           if( msg_socket==INVALID_SOCKET)
    { printf( "\nError  in accept "); return -5;}
     
       SPair.IsUser_ProxyClosed=FALSE;
     SPair.IsProxy_ServerClosed=TRUE;
     SPair.user_proxy=msg_socket;  retval=recv(SPair.user_proxy,Buffer,BUFSIZE * 100,0);
     
     if(retval==SOCKET_ERROR)

          printf("\nError Recv"); 
          if(SPair.IsUser_ProxyClosed==FALSE)
    {
     closesocket(SPair.user_proxy);
     SPair.IsUser_ProxyClosed=TRUE;
    }
    }  if(retval==0)
    {
        printf("Client Close connection\n");
         if(  SPair.IsUser_ProxyClosed==FALSE)
    {
     closesocket(SPair.user_proxy);
      SPair.IsUser_ProxyClosed=TRUE;
    }
    }  Len=retval;
    #ifdef _DEBUG  Buffer[Len]=0;
     printf("\n Received %d bytes,data[%s]from client\n",retval,Buffer);
    #endif
      
     
     ProxyP.pPair=&SPair;
     ProxyP.User_SvrOK=CreateEvent(NULL,TRUE,FALSE,NULL);
     
     GetAddressAndPort( Buffer,ProxyP.Address,&ProxyP.Port);  pChildThread=AfxBeginThread(ProxyToServer,(LPVOID)&ProxyP);  ::WaitForSingleObject(ProxyP.User_SvrOK,60000);   
     ::CloseHandle(ProxyP.User_SvrOK);  while(SPair.IsProxy_ServerClosed ==FALSE && SPair.IsUser_ProxyClosed==FALSE)
     {
       retval=send(SPair.proxy_server,Buffer,Len,0);
       if(retval==SOCKET_ERROR)
    { printf("\n send() failed:error%d\n",WSAGetLastError());
         if(SPair.IsProxy_ServerClosed==FALSE)
    {
    closesocket(SPair.proxy_server);
    SPair.IsProxy_ServerClosed=TRUE;
    }
      continue;
    }
        retval=recv(SPair.user_proxy,Buffer,sizeof(Buffer),0);
     
    if(retval==SOCKET_ERROR)
    { printf("\nError Recv"); 
          if(SPair.IsUser_ProxyClosed==FALSE)
    {
      closesocket(SPair.user_proxy);
      SPair.IsUser_ProxyClosed=TRUE;
    }
          continue;
    }
    if(retval==0) {printf("Client Close connection\n");
         
    if(SPair.IsUser_ProxyClosed==FALSE)
    {
     closesocket(SPair.user_proxy);
     SPair.IsUser_ProxyClosed=TRUE;
    }
     break;
    }
    Len=retval;
    #ifdef _DEBUG
    Buffer[Len]=0;
        printf("\n Received %d bytes,data[%s]from client\n",retval,Buffer);
    #endif

      }       if(SPair.IsProxy_ServerClosed==FALSE)
    {
    closesocket(SPair.proxy_server);
    SPair.IsProxy_ServerClosed=TRUE;
    }  if(SPair.IsUser_ProxyClosed==FALSE)
    {
             closesocket(SPair.user_proxy);
     SPair.IsUser_ProxyClosed=TRUE;
    } ::WaitForSingleObject(pChildThread->m_hThread,20000); 
    delete [] Buffer;
    return 0;

    UINT ProxyToServer(LPVOID pParam)
    {
        ProxyParam * pPar=(ProxyParam*)pParam;
    char * Buffer = new char[BUFSIZE * 100];
    char *server_name= "localhost";
    unsigned short port ;
    int retval,Len;
    unsigned int addr;
    int socket_type ;
    struct sockaddr_in server;
    struct hostent *hp;
    SOCKET  conn_socket; socket_type = SOCK_STREAM;
    server_name = pPar->Address;
    port = pPar->Port; if (isalpha(server_name[0])) 
    {    
    hp = gethostbyname(server_name);
    }
    else  
    {  
    addr = inet_addr(server_name);
    hp = gethostbyaddr((char *)&addr,4,AF_INET);
    }
    if (hp == NULL )
    {
    fprintf(stderr,"Client: Cannot resolve address [%s]: Error %d\n",
    server_name,WSAGetLastError());
    ::SetEvent(pPar->User_SvrOK);
    return 0;
    }  
    memset(&server,0,sizeof(server));
    memcpy(&(server.sin_addr),hp->h_addr,hp->h_length);
    server.sin_family = hp->h_addrtype;
    server.sin_port = htons(port); conn_socket = socket(AF_INET,socket_type,0); 

    if (conn_socket <0 ) 
    {
    fprintf(stderr,"Client: Error Opening socket: Error %d\n",
    WSAGetLastError());
    pPar->pPair->IsProxy_ServerClosed=TRUE;
    ::SetEvent(pPar->User_SvrOK);
    return -1;
    }
    #ifdef _DEBUG
    printf("Client connecting to: %s\n",hp->h_name);
    #endif if (connect(conn_socket,(struct sockaddr*)&server,sizeof(server)) == SOCKET_ERROR) 
    {
    fprintf(stderr,"connect() failed: %d\n",WSAGetLastError());
    pPar->pPair->IsProxy_ServerClosed=TRUE;
    ::SetEvent(pPar->User_SvrOK);
    return -1;
    } pPar->pPair->proxy_server=conn_socket;
    pPar->pPair->IsProxy_ServerClosed=FALSE;
        ::SetEvent(pPar->User_SvrOK);
     
    while(!pPar->pPair->IsProxy_ServerClosed  && !pPar->pPair->IsUser_ProxyClosed )
    {
    retval = recv(conn_socket,Buffer,BUFSIZE * 100,0 ); if (retval == SOCKET_ERROR ) 
    {
    fprintf(stderr,"recv() failed: error %d\n",WSAGetLastError());
    closesocket(conn_socket);
    pPar->pPair->IsProxy_ServerClosed=TRUE;
    break;
    }
    Len=retval;
         if (retval ==0) 
    {
    printf("Server closed connection\n");
    closesocket(conn_socket);
    pPar->pPair->IsProxy_ServerClosed=TRUE;
    break;

    }  retval = send(pPar->pPair->user_proxy,Buffer,Len,0);
     
    if (retval == SOCKET_ERROR) 
    {
    fprintf(stderr,"send() failed: error %d\n",WSAGetLastError()); closesocket(pPar->pPair->user_proxy);
    pPar->pPair->IsUser_ProxyClosed=TRUE;
    break;
    }

    } if(pPar->pPair->IsProxy_ServerClosed==FALSE)
    {
    closesocket(pPar->pPair->proxy_server);
    pPar->pPair->IsProxy_ServerClosed=TRUE;
    }  if(pPar->pPair->IsUser_ProxyClosed==FALSE)
    {
             closesocket(pPar->pPair->user_proxy);
     pPar->pPair->IsUser_ProxyClosed=TRUE;
    } delete[] Buffer;
     return 1;
    }int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    int nRetCode = 0;  
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
     
    cerr << _T("Fatal Error: MFC initialization failed") << endl;
    nRetCode = 1;
    }
    else
    {
     
    StartServer();
    while(1) if(getchar()=='q') break; CloseServer();
    } return nRetCode;
    }
      

  3.   

    http代理是比较麻烦的,主要是各种认证方式啊,什么NTLM,Digest,Basic等