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; }
if( AuthPassword( sock ) == -1 ) { //printf( "auth password error\n" ); return -1; } int real_server_sock = ParseCommand( sock ); if( real_server_sock == -1 ) { //printf( "parse command error.\n" ); return -1; } ForwardData( sock, real_server_sock );
close( sock ); close( real_server_sock ); return 0; }
int main( int argc, char *argv[] ) { if( argc != 2 ) { printf( "Socks5 proxy for test,code by YunShu\n" ); printf( "Usage: %s <proxy_port>\n", argv[0] ); printf( "Options:\n" ); printf( " <proxy_port> ---which port of this proxy server will listen.\n" ); return 1; }
struct sockaddr_in sin;
memset( (void *)&sin, 0, sizeof( struct sockaddr_in) ); sin.sin_family = AF_INET; sin.sin_port = htons( atoi(argv[1]) ); sin.sin_addr.s_addr = htonl(INADDR_ANY);
int listen_sock = socket( AF_INET, SOCK_STREAM, 0 ); if( listen_sock < 0 ) { perror( "Socket creation failed\n"); return -1; }
int opt = SO_REUSEADDR; setsockopt( listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt) );
if( bind( listen_sock, (struct sockaddr*)&sin, sizeof(struct sockaddr_in) ) < 0 ) { perror( "Bind error" ); return -1; }
if( listen( listen_sock, MAX_USER ) < 0 ) { perror( "Listen error" ); return -1; }
struct sockaddr_in cin; int client_sock; int client_len = sizeof( struct sockaddr_in );
while( client_sock = accept( listen_sock, (struct sockaddr *)&cin, (socklen_t *)&client_len ) ) { printf( "Connected from %s, processing\n", inet_ntoa( cin.sin_addr ) );
pthread_t work_thread; if( pthread_create( &work_thread, NULL, (void *)Socks5, (void *)&client_sock ) ) { perror( "Create thread error" ); close( client_sock ); } else { pthread_detach( work_thread ); } } } 上一页 [1] [2]
|