向代理服务器发送UDP请求之后,如何编写代码发送UDP数据包,在线等.谢谢!!!

解决方案 »

  1.   

    ?????你已经和代理协商好UDP association?,如果没有,那么发了也没有,如果协商好了,还不是很简单,发送的真正数据前面加10个字节的内容,里面按socks5协议规定放置接收方IP和端口,然后发送到代理的绑定端口,代理收到后从前面10字节解析目的地,然后把后面的数据发给对方,如果代理在这个绑定端口上收到udp包,那么就会在数据前加10字节一股脑发到你的udp监听端口,你解析前10字节,就知道是谁发给你的,10字节后面就是数据
      

  2.   

    http://search.csdn.net/Expert/topic/1052/1052603.xml?temp=.1589472
      

  3.   

    to tangrh:
       与代理服务器协商UDP association请求时,其中DST.ADDR和DST.PORT是本地的吗?
      

  4.   

    哈哈,当然是的啊,不然socks代理怎么知道收到的udp包要返回给谁呢,地址填全0,因为socks代理知道你的地址,而且你绑定的时候一般不会指定地址绑
      

  5.   

    我是这样做,可是发送UDP数据包之后,接不到目标主机的回应,不知是什么原因?
      

  6.   

    发送到socks代理的绑定UDP端口
      

  7.   

    socks代理的绑定UDP端口就是与代理服务器协商UDP association请求时发送的DST.PORT.是不是?
      

  8.   

    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=202544
      

  9.   

    socks代理的绑定UDP IP和端口就是代理返回协商结果里的那个ip和端口,如果它返回这个,表明它已经建好了udp套接字,并且已经在这个套接字上准备接收你要转发的udp包,你发送到这个地址端口,代理就会收到,然后转发,对方则会发到代理的这个端口,代理一看就知道是发给你的,马上转发给你
      

  10.   

    to tangrh:
        请您检查下面的程序,看哪里有错? 大家都可以帮忙查下.谢谢!!!
    void CProxyClientDlg::OnConnect() 
    {
    GetDlgItemText(IDC_PROXYADDR,m_ProxyAddr);
    GetDlgItemText(IDC_PROXYPORT,m_ProxyPort);
    if(m_ProxyAddr.IsEmpty () || m_ProxyPort.IsEmpty ())
    {
    AfxMessageBox("代理服务器地址框和端口框不能为空,请输入相应的数据!");
    return;
    } GetDlgItemText(IDC_DESTADDR,m_DestAddr);
    if(m_DestAddr.IsEmpty ())
    {
    AfxMessageBox("目标服务器地址框不能为空,请输入IP数据!");
    return;
    }

    //连接代理服务器
        WSADATA wsaData;
        if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL

    AfxMessageBox("Can't Initialize Windows Socket Dll!");
    WSACleanup();
    return;
    }

    ServerSocket=socket(AF_INET,SOCK_STREAM,0);//创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信

        if(ServerSocket == INVALID_SOCKET)
    {
    AfxMessageBox("Create Socket Fail!");
    return;
    } GetDlgItem(IDC_PROXYPORT)->GetWindowText(m_ProxyPort);
    ProxyAddress.sin_family =AF_INET;
    ProxyAddress.sin_port =htons(atoi(m_ProxyPort));
        in_addr address;
    address=GetIpByDestHost(m_ProxyAddr.GetBuffer(0));
    ProxyAddress.sin_addr=address; if(connect(ServerSocket,(LPSOCKADDR)&ProxyAddress,sizeof(ProxyAddress)) == SOCKET_ERROR)
        {
        list.InsertString(0,"无法代理连接服务器。");
            return;
    }  list.InsertString(0,"连接代理服务器成功!");//连接后客户端发送一个版本标识/方法选择的TCP报文需求给代理服务器
    m_ClientReq1=(Socks5Req1*)buffer;
    m_ClientReq1->Ver=0x05;
    m_ClientReq1->nMethods=01;
    m_ClientReq1->Methods[0]=0x00;

        int ret=send(ServerSocket,buffer,3,0);
    if(ret==SOCKET_ERROR)
    {
    AfxMessageBox("Firstly Send Client Requirement Fail!");
    closesocket(ServerSocket);
    return;
    } if(recv(ServerSocket,buffer,sizeof(buffer),0) == SOCKET_ERROR)
    list.InsertString(0,"接收数据发生错误!");
    //代理服务器接收客户端的请求后,根据自身系统的实现返回并告诉客户端采用哪种方法验证
    //即接收代理服务器的应答 m_ProxyAns1=(Socks5Ans1*)buffer; if(m_ProxyAns1->Ver==0x05 && m_ProxyAns1->Method==0xFF)
    {
    list.InsertString (0,"代理服务器没有可接受的方法。");
        closesocket(ServerSocket);
    return;
    } UdpSocket=socket(AF_INET,SOCK_DGRAM,0);
    if(UdpSocket==SOCKET_ERROR)
    {
    list.InsertString (0,"创建UDP SOCKET失败!");
    return;
        } m_ClientReq2 = (Socks5Req2 *)buffer;
    m_ClientReq2->Ver=0x05;
    m_ClientReq2->Cmd=0x03;
    m_ClientReq2->Rsv=0x00;
    m_ClientReq2->Atyp=0x01;
    m_ClientReq2->LocalAddr.s_addr=inet_addr(GetLocalIpByName());
    m_ClientReq2->LocalPort=htons(UdpSocket); ret=send(ServerSocket,buffer,sizeof(buffer),0);
    if(ret==SOCKET_ERROR)
    {
    AfxMessageBox("Secondly Send Client Requirement Fail!");
    closesocket(ServerSocket);
    return;
    }

    if(recv(ServerSocket,buffer,sizeof(buffer),0) == SOCKET_ERROR)
    list.InsertString(0,"接收数据发生错误!");

    m_ProxyAns2=(Socks5Ans2*)buffer; if(m_ProxyAns2->Rep!=0x00)
    {
    list.InsertString (0,"发送UDP请求失败!");
    closesocket(ServerSocket);
    return;
    } BndAddress.sin_family =AF_INET;
    BndAddress.sin_port =m_ProxyAns2->SerbndPort;
    BndAddress.sin_addr=m_ProxyAns2->SerbndAddr;    list.InsertString(0,"发送UDP请求成功!");}void CProxyClientDlg::OnSend() 
    {
    GetDlgItemText(IDC_EDIT_MESSAGE,str);
    if(str.IsEmpty())
    {
    list.InsertString(0,"发送的字符串不能为空。");
    return;
    }

    m_ClientUdp=(UdpheadInfo*)buffer;
    m_ClientUdp->Rsv=0x00;
    m_ClientUdp->Flag=0x00;
    m_ClientUdp->Atyp=0x01;  char *DestHAddr=m_DestAddr.GetBuffer(0);
    in_addr Destaddress=GetIpByDestHost(DestHAddr);
    CopyMemory(&m_ClientUdp->DestAddr,&Destaddress,4); GetDlgItemText(IDC_DESTPORT,m_DestPort);
    m_ClientUdp->DestPort=htons((short)atoi(m_DestPort.GetBuffer(0)));

    strcpy(m_ClientUdp->Data,(LPCTSTR)str); if(sendto(UdpSocket,buffer,sizeof(buffer),0,(LPSOCKADDR)&BndAddress,sizeof(BndAddress)) == SOCKET_ERROR)// recv(ServerSocket,buf,sizeof(buf),0);
    {
    list.InsertString(0,"发送数据发生错误。");
    }
    else
    list.InsertString(0,"客户端信息: "+str);

    int len=sizeof(BndAddress);
    if(recvfrom(UdpSocket,buffer,sizeof(buffer),0,(LPSOCKADDR)&BndAddress,&len) == SOCKET_ERROR)
    {
    list.InsertString(0,"接收数据发生错误!");
    return;
    }

    m_ClientUdp=(UdpheadInfo*)buffer;
    str.Format("%s",m_ClientUdp->Data);
    list.InsertString(0,"服务端信息: "+str);
    list.InsertString (0,"UDP数据包发送成功!");
    str.Empty();
    UpdateData(FALSE);
    ((CEdit *)GetDlgItem(IDC_EDIT_MESSAGE))->SetActiveWindow();
    }
      

  11.   

    兄弟,你还是好好看看socks5协议吧,网络上有人翻译了中文版,还有一篇好文章叫UDP穿透socks5代理编程,google上搜索一把多得一塌糊涂
    m_ClientReq2->LocalPort=htons(UdpSocket);本地绑定端口怎么是套接字句柄?
      

  12.   

    本地绑定端口是套接字句柄,是为了防止端口号冲突!
    至于UDP穿透SOCKS5代理编程这个文章,我看过,可是还不太懂.请赐教!