安全中国首页 > 文章中心 > 网管天地
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

Linux平台socks5代理

更新时间:2008-1-26 0:09:47
责任编辑:阿loosen
热 点:

 memset( reply_buffer, 0, sizeof(BUFF_SIZE) );

 socks5_response = (SOCKS5_RESPONSE *)reply_buffer;

 socks5_response->version = VERSION;
 socks5_response->reserved = 0x00;
 socks5_response->address_type = 0x01;
 memset( socks5_response + 4, 0 , 6 );

 ret = connect( real_server_sock, (struct sockaddr *)&sin, sizeof(struct sockaddr_in) );
 if( ret == 0 )
 {
 socks5_response->reply = 0x00;
 if( -1 == send( sock, socks5_response, 10, 0 ) )
 {
 close( sock );
 
 return -1;
 }
 }
 else
 {
 perror( "Connect to real server error" );
 socks5_response->reply = 0x01;
 send( sock, socks5_response, 10, 0 );
 
 close( sock );
 return -1;
 }
 
 return real_server_sock;
}

int ForwardData( int sock, int real_server_sock )
{
 char recv_buffer[BUFF_SIZE] = { 0 };
 
 fd_set fd_read;
 struct timeval time_out;

 time_out.tv_sec = 0;
 time_out.tv_usec = TIME_OUT;
 
 int ret = 0;
 
 while( 1 )
 {
 FD_ZERO( &fd_read );
 FD_SET( sock, &fd_read );
 FD_SET( real_server_sock, &fd_read );

 ret = select( (sock > real_server_sock ? sock : real_server_sock) + 1, &fd_read, NULL, NULL, &time_out );
 if( -1 == ret )
 {
 perror( "select socket error" );
 break;
 }
 else if( 0 == ret )
 {
 //perror( "select time out" );
 continue;
 }
 
 //printf( "[DEBUG] testing readable!\n" );
 if( FD_ISSET(sock, &fd_read) )
 {
 //printf( "client can read!\n" );
 memset( recv_buffer, 0, BUFF_SIZE );
 ret = recv( sock, recv_buffer, BUFF_SIZE, 0 );
 if( ret > 0 )
 {
 //printf( "%s", recv_buffer );
 //printf( "recv %d bytes from client.\n", ret );
 ret = send( real_server_sock, recv_buffer, ret, 0 );
 if( ret == -1 )
 {
 perror( "send data to real server error" );
 break;
 }
 //printf( "send %d bytes to client!\n", ret );
 }
 else if( ret == 0 )
 {
 //printf( "client close socket.\n" );
 break;
 }
 else
 {
 //perror( "recv from client error" );
 break;
 }
 }
 
 else if( FD_ISSET(real_server_sock, &fd_read) )
 {
 //printf( "real server can read!\n" );
 memset( recv_buffer, 0, BUFF_SIZE );
 ret = recv( real_server_sock, recv_buffer, BUFF_SIZE, 0 );
 if( ret > 0 )
 {
 //printf( "%s", recv_buffer );
 //printf( "recv %d bytes from real server.\n", ret );
 ret = send( sock, recv_buffer, ret, 0 );
 if( ret == -1 )
 {
 perror( "send data to client error" );
 break;
 }
 }
 else if( ret == 0 )
 {
 //printf( "real server close socket.\n" );
 break;
 }
 else
 {
 perror( "recv from real server error" );
 break;
 }
 }
 }
 
 return 0;
}

int Socks5( void *client_sock )
{
 int sock = *(int *)client_sock;

 if( SelectMethod( sock ) == -1 )
 {
 //printf( "socks version error\n" );
 return -1;
 } 
 

上一页 1 2 3 4 下一页

 
相关文章
一日一文章
 
一日一软件
一日一动画