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 3 4 |