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 下一页 |