袜子 5 UDP 连接

Posted

技术标签:

【中文标题】袜子 5 UDP 连接【英文标题】:Socks 5 UDP connection 【发布时间】:2013-10-24 08:51:51 【问题描述】:

我正在尝试连接到 UDP Socks5 代理,但没有服务器会回复我的初始握手。 Wire Shark 显示正确的信号正在发送到服务器,但没有收到回复

#define PUT_BYTE(ptr,data) (*(unsigned char*)ptr = data)



static int Connect_proxy(SOCKET sock,sockaddr_in Rcv_address) 

char buff[200],*ptr;
sockaddr_in SenderAddrTemp;
int SenderAddrSize= sizeof(SenderAddrTemp);

ptr=buff;
int iResult;

PUT_BYTE(ptr++,5);
PUT_BYTE(ptr++,1);
PUT_BYTE(ptr++,0);  


iResult = sendto(sock,
    buff, ptr-buff, 0, (SOCKADDR *) & Rcv_address, sizeof (Rcv_address));

if (iResult == SOCKET_ERROR) 
    wprintf(L"[Send]Conection request failed with error: %d\n",      WSAGetLastError());
    //closesocket(sock);
    //WSACleanup();
    return -1;


iResult = recvfrom(sock,buff, 200, 0, (SOCKADDR *) & SenderAddrTemp, &SenderAddrSize);
if (iResult==-1)  
    wprintf(L"[Recv] Connection request failed with error: %d\n", WSAGetLastError());
    return -1;

else
    if (iResult==2)  
        wprintf(L"OK");
    

    return 0;

套接字初始化是:

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) 
    wprintf(L"WSAStartup failed with error: %d\n", iResult);
    return 1;


//---------------------------------------------
// Create a socket for sending data
SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (SendSocket == INVALID_SOCKET) 
    wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
    WSACleanup();
    return 1;



RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = htons(8888);
RecvAddr.sin_addr.s_addr = inet_addr("114.207.246.173");

service.sin_family = AF_INET;
service.sin_addr.s_addr = htonl(INADDR_ANY);
service.sin_port = htons(0);

bind(SendSocket, (SOCKADDR *) &service, sizeof (service));

if (iResult == SOCKET_ERROR) 
    wprintf(L"bind failed with error %u\n", WSAGetLastError());
    closesocket(SendSocket);
    WSACleanup();
    return 1;

Connect_proxy(SendSocket,RecvAddr);

谢谢!

【问题讨论】:

问题已解决。 Socks 5 连接必须使用 TCP 套接字,而不是 UDP。在初始 TCP 握手和连接之后,您才可以请求一个 UDP 端口进行连接。 【参考方案1】:

固定:

虽然socks连接是UDP,但握手必须在TCP中完成

SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //这必须成为一个 TCP 套接字 SOCK_STREAM

【讨论】:

你能给我看看代码吗?您通过代理为 UDP 连接所做的工作。我也在做同样的事情,但没有运气。 这是很久以前的事了。我想我什至没有。但修复基本上是绿色复选标记回复

以上是关于袜子 5 UDP 连接的主要内容,如果未能解决你的问题,请参考以下文章

运输层(TCP/UDP)详解

jmeter与tcp和udp建立连接

TCP与UDP 的区别

TCP和UDP的区别

java中的袜子(通过袜子打开)

TCP和UDP协议的区别