#include <windows.h>
#include <stdio.h>
#define PROXY_IP "xxx.xxx.xxx.xxx"
#define PROXY_PORT 1080
#define DEST_IP "xxx.xxx.xxx.xxx"
#define DEST_PORT 8888
#define LOCAL_IP "xxx.xxx.xxx.xxx"
#define LOCAL_PORT 6666
int main()
{
int fd, fd_udp;
struct sockaddr_in name;
WSADATA wsaData;
char buf[100];
int len;
int i;
if(WSAStartup(MAKEWORD( 2, 2 ), &wsaData ))
return 1;
if((fd_udp = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
return 1;
if((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
return 1;
memset(&name, 0, sizeof(name));
name.sin_family = AF_INET;
name.sin_addr.s_addr = inet_addr(PROXY_IP);
name.sin_port = htons(PROXY_PORT);
if(connect(fd, (struct sockaddr*)&name, sizeof(name)) != 0)
return 1;
buf[0] = 5;
buf[1] = 1;
buf[2] = 0;
send(fd, buf, 3, 0);
recv(fd, buf, 2, 0);
if(buf[0] != 5 || buf[1] != 0)
return 1;
buf[0] = 5; /* protocol version */
buf[1] = 3; /* command UDP associate */
buf[2] = 0; /* reserved */
buf[3] = 1; /* address type IP v4 */
len = sizeof(name);
memset(&name, 0, sizeof(name));
name.sin_family = AF_INET;
name.sin_addr.s_addr = inet_addr(LOCAL_IP);
name.sin_port = htons(LOCAL_PORT);
bind(fd_udp,(struct sockaddr *)&name,len);
*(unsigned int*)&buf[4] = inet_addr(LOCAL_IP);//name.sin_addr.s_addr;
*(unsigned short*)&buf[8] = htons(LOCAL_PORT);
send(fd, buf, 10, 0);
recv(fd, buf, 10, 0);
if(buf[0] != 5)
return 11;
memset(&name, 0, sizeof(name));
name.sin_family = AF_INET;
name.sin_addr.s_addr = *(int*)&buf[4];
name.sin_port = (*(short*)&buf[8]);
connect(fd_udp, (struct sockaddr *)&name, sizeof(name));
for(i = 0; i <100; i++)
{
buf[0] = 0; /* reserved */
buf[1] = 0; /* reserved */
buf[2] = 0; /* standalone packet */
buf[3] = 1; /* address type IP v4 */
*(unsigned long*)&buf[4] = inet_addr(DEST_IP);
*(unsigned short*)&buf[8] = htons(DEST_PORT);
*(unsigned int*)&buf[10] = i;
send(fd_udp, buf, 14, 0);
recv(fd_udp, buf, 14, 0);
printf("udp received: %d\n", *(int*)&buf[10]);
}
closesocket(fd_udp);
closesocket(fd);
WSACleanup();
return 0;
}