< TCP/IP Session - START >
RECV ==> 3 bytes: (0x5)(0x1)(0x0)
SEND ==> 2 bytes: (0x5)(0x0)
RECV ==> 10 bytes: (0x5)(0x3)(0x0)(0x1)(0x0)(0x0)(0x0)(0x0)(0x6)(0x32)
SEND ==> 10 bytes: (0x5)(0x0)(0x0)(0x1)(0x7f)(0x0)(0x0)(0x1)(0x22)(0x6b)
< TCP/IP Session - END >
void Launch_TCP( int service_port, const char *udp_proxy_ip, int udp_proxy_port, short *clt_udp_port )
{
//port is NOT network orders
struct sockaddr_in servaddr,clientaddr;
int clientlen;
int listenfd, connfd;
int n;
//定?socket, bind, listen, accept,?於?些操作的?料太多了,不?述
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(service_port);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if(listenfd < 0) {
p_error("socket error");
exit(-1);
}
if( bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) {
p_error("bind error");
exit(-1);
}
if( listen(listenfd, 5) < 0 ) {
p_error("listen error");
exit(-1);
}
connfd = accept( listenfd, (struct sockaddr *)&clientaddr, &clientlen );
if( connfd < 0 ) {
p_error("accept error");
exit(-1);
}
printf("< TCP/IP Session - START >\n\n");
//接受第一句?求
n = recv( connfd, buf, BUFSZ, 0 );
debug_showbin( buf, n, "RECV", "\n" );
//目前我??只支持?o身份??的?求,即"05 01 00"
if( buf[0]==0x5 && buf[1]==0x1 && buf[2]==0x0) {
buf[0] = 0x5;
buf[1] = 0x0;
//返回"05 00",代表成功
send( connfd, buf, 2, 0 );
debug_showbin( buf, 2, "SEND", "\n\n" );
} else {
p_error("Session ERROR!\n");
exit(-1);
}
//接受第二句?求
n = recv( connfd, buf, BUFSZ, 0 );
debug_showbin( buf, n, "RECV", "\n" );
//只?理UDP?求(0x03)
if( buf[0]==0x5 && buf[1]==0x3 ) { //Client request a UDP Proxy
short udp_port;
long udp_ip;
//提取?K?Υ嬋?舳說?DP埠?
int seg=4;
if( buf[3] == 0x3 )
seg = buf[4]+1;
memcpy( clt_udp_port, &buf[4+seg], 2 );
*clt_udp_port = ntohs( *clt_udp_port );
buf[0] = 0x5;
buf[1] = 0x0;
buf[2] = 0x0;
buf[3] = 0x1;
//把本?CUDP SOCKET的IP和PORT返回?QQ
udp_ip = inet_addr( udp_proxy_ip );
udp_port = htons( udp_proxy_port );
memcpy( &buf[4], &udp_ip, 4 );
memcpy( &buf[8], &udp_port, 2 );
send(connfd, buf, 10, 0 );
debug_showbin( buf, 10, "SEND", "\n\n" );
} else {
p_error("Session ERROR: Client doesn't need a UDP Proxy!\n");
exit(-1);
}
//握手?程完成
close(connfd);
close(listenfd);
printf("< TCP/IP Session - END >\n\n");
}
[火星人 ] ?檳愕?Q造一??SOCK5 PROXY(Gcc篇)之二已經有319次圍觀