通过socks5代理来建立发送tcp消息没有任何问题,但是udp就不行了,请问为什么
我的思路是:
根据rfc1928与代理服务器建立连接的方式基本上与tcp一样就是把第二次发送时候的
把CMD设置为3,也就是UDP ASSOCIATE X'03',
接着的区别是,
如果tcp,直接用建立的socket 调用send recv就可以了
如果是发送udp消息,就以这样的格式发送
  +----+------+------+----------+----------+----------+
  |RSV | FRAG | ATYP | DST.ADDR | DST.PORT |  DATA |
  +----+------+------+----------+----------+----------+
  | 2 |  1 |  1 | Variable |  2   | Variable |
  +----+------+------+----------+----------+----------+
我做了个很简单的试验
char udpData[100];memset(&udpData,0,100);
udpData[0]=0;//RSV
udpData[1]=0;//FRAG
udpData[3]=1;//表示ipv4
len=4;
lip=inet_addr("192.168.1.70");//目的机的ip
memcpy(&udpData[len],&lip,4);
len+=4;
uport=htons(2004);//目的机的端口
memcpy(&udpData[len],&uport,2);
len+=2;
memcpy(&udpData[len],"hello",5);//发送一个字符串
len+=5;
s.Send(&udpData,len);//发送出去了,但是另外的udp接受端没反映

解决方案 »

  1.   

    不好意思少了一句代码,重新贴一下:)
    char udpData[100];memset(&udpData,0,100);
    udpData[0]=0;
    udpData[1]=0;
    udpData[2]=0;
    udpData[3]=1;
    len=4;
    lip=inet_addr("192.168.1.70");
    memcpy(&udpData[len],&lip,4);
    len+=4;
    uport=/*htons(2004);*/htons(2004);
    memcpy(&udpData[len],&uport,2);
    len+=2;
    memcpy(&udpData[len],"hello",5);
    len+=5;
    s.Send(&udpData,len);
      

  2.   

    握手的时候使用的是TCP连接,握手成功,发消息的时候使用UDP,但那个TCP不可以断,你是不是握手之后就断开了?
      

  3.   

    当然没有断开啊,我仍旧是那个socket来发送消息的
      

  4.   

    我把整个连接和发送udp消息的代码列出来,写的比较蠢,测试用,呵呵,别见笑
    192.168.1.70是我的机器ip地址8888是我的机器上的wingate开的sock5端口,2004是负责接受udp消息的端口,如果我不通过代理,直接发送udp是可以接受到消息的比如
    CSocket sc;
    sc.Create(2005,SOCK_DGRAM);
    sc.SendTo("hello",5,2004,"192.168.1.70");
    下面的代码是通过代理发消息,就不行了,请教各位,谢谢了
    BOOL TryUDPProxy()
    {
    CSocket s;
    if(!s.Create())
    return FALSE;
    if(!s.Connect("192.168.1.70",8888))
    return FALSE;
    char command[10];
    memset(command,0,10);
    command[0]=5;
    command[1]=1; //Number of logon types
    command[2]=0; //2=user/pass, 0=no logon
    int len=false?4:3; //length of request int read=s.Send(command,len);
    if(read<=0)
    return FALSE;
    char rcvData[2];
    memset(rcvData,0,2);

    read=s.Receive(rcvData,2); if(rcvData[0] != 5 || (rcvData[1]!=0 && rcvData[1]!=2))
    {
    AfxMessageBox(_T("通过代理连接主站不成功!"));
    s.Close();
    return FALSE;
    }
    char *pcommand=new char[10+strlen("192.168.1.70")+1];
    memset(pcommand,0,10+strlen("192.168.1.70")+1);
    pcommand[0]=5;
    pcommand[1]=3;
    pcommand[2]=0;
    pcommand[3]=1;
    len=4;
    ULONG lip=inet_addr("192.168.1.70");
    memcpy(&pcommand[len],&lip,4);
    len+=4;
    USHORT uport=htons(2004);
    memcpy(&pcommand[len],&uport,2);
    len+=2;
    read=s.Send(pcommand,len);
    if(read<=0)
    return FALSE;
    delete pcommand;
    char rcvchar[100];memset(rcvchar,0,100);
    read=s.Receive(rcvchar,100);
    if(read<=0)
    return FALSE;
    if (rcvchar[1]!=0 || rcvchar[0]!=5)
    {
    AfxMessageBox(_T("通过代理连接主站不成功!"));
    s.Close();
    return FALSE;
    }
    //////////////////////////////
    UINT ir;memcpy(&ir,&rcvchar[4],4); sockaddr_in acptsi;acptsi.sin_addr.s_addr=(u_long)ir;
    AfxMessageBox(inet_ntoa(acptsi.sin_addr));
    u_short uports;memcpy(&uports,&rcvchar[8],2);uports=htons(uports); char udpData[100];memset(&udpData,0,100);
    udpData[0]=0;
    udpData[1]=0;
    udpData[2]=0;
    udpData[3]=1;
    len=4;
    lip=inet_addr("192.168.1.70");
    memcpy(&udpData[len],&lip,4);
    len+=4;
    uport=/*htons(2004);*/htons(2004);
    memcpy(&udpData[len],&uport,2);
    len+=2;
    memcpy(&udpData[len],"hello",5);
    len+=5;
    read=s.Send(&udpData,len);
    return TRUE;
    }