@@ -843,25 +843,39 @@ awaitable<void> socks5_access(tcp_socket client_socket, const char *username, co
843843 }
844844}
845845
846- awaitable<void > listener_v4 (const char *username, const char *password)
846+ awaitable<void > listener_ipv4 (const char *username, const char *password, uint16_t port = 1080 )
847847{
848848 asio::any_io_executor executor = co_await this_coro::executor;
849- tcp_acceptor acceptor (executor, { tcp::v4 (), 1080 });
850- while (true )
849+ try
850+ {
851+ tcp_acceptor acceptor (executor, { tcp::v4 (), port });
852+ while (true )
853+ {
854+ tcp_socket socket = co_await acceptor.async_accept ();
855+ co_spawn (executor, socks5_access (std::move (socket), username, password), detached);
856+ }
857+ }
858+ catch (std::exception &e)
851859 {
852- tcp_socket socket = co_await acceptor.async_accept ();
853- co_spawn (executor, socks5_access (std::move (socket), username, password), detached);
860+ std::printf (" IPv4 socks5_listen Exception: %s\n " , e.what ());
854861 }
855862}
856863
857- awaitable<void > listener_v6 (const char *username, const char *password)
864+ awaitable<void > listener_ipv6 (const char *username, const char *password, uint16_t port = 1080 )
858865{
859866 asio::any_io_executor executor = co_await this_coro::executor;
860- tcp_acceptor acceptor (executor, { tcp::v6 (), 1080 });
861- while (true )
867+ try
868+ {
869+ tcp_acceptor acceptor (executor, { tcp::v6 (), port });
870+ while (true )
871+ {
872+ tcp_socket socket = co_await acceptor.async_accept ();
873+ co_spawn (executor, socks5_access (std::move (socket), username, password), detached);
874+ }
875+ }
876+ catch (std::exception &e)
862877 {
863- tcp_socket socket = co_await acceptor.async_accept ();
864- co_spawn (executor, socks5_access (std::move (socket), username, password), detached);
878+ std::printf (" IPv6 socks5_listen Exception: %s\n " , e.what ());
865879 }
866880}
867881
@@ -874,15 +888,42 @@ int main(int argc, char *argv[])
874888 asio::signal_set signals (io_context, SIGINT, SIGTERM);
875889 signals.async_wait ([&](auto , auto ) { io_context.stop (); });
876890
877- if (argc == 3 )
891+ if (argc == 1 )
892+ {
893+ co_spawn (io_context, listener_ipv4 (nullptr , nullptr ), detached);
894+ co_spawn (io_context, listener_ipv6 (nullptr , nullptr ), detached);
895+ }
896+ else if (argc == 2 )
897+ {
898+ int port = std::stoi (argv[1 ]);
899+ if (port < 1 || port > 65535 )
900+ {
901+ std::printf (" Incorrect port number: %d\n " , port);
902+ return 1 ;
903+ }
904+ co_spawn (io_context, listener_ipv4 (nullptr , nullptr , (uint16_t )port), detached);
905+ co_spawn (io_context, listener_ipv6 (nullptr , nullptr , (uint16_t )port), detached);
906+ }
907+ else if (argc == 3 )
908+ {
909+ co_spawn (io_context, listener_ipv4 (argv[1 ], argv[2 ]), detached);
910+ co_spawn (io_context, listener_ipv6 (argv[1 ], argv[2 ]), detached);
911+ }
912+ else if (argc == 4 )
878913 {
879- co_spawn (io_context, listener_v4 (argv[1 ], argv[2 ]), detached);
880- co_spawn (io_context, listener_v6 (argv[1 ], argv[2 ]), detached);
914+ int port = std::stoi (argv[1 ]);
915+ if (port < 1 || port > 65535 )
916+ {
917+ std::printf (" Incorrect port number: %d\n " , (uint16_t )port);
918+ return 1 ;
919+ }
920+ co_spawn (io_context, listener_ipv4 (argv[2 ], argv[3 ], port), detached);
921+ co_spawn (io_context, listener_ipv6 (argv[2 ], argv[3 ], port), detached);
881922 }
882923 else
883924 {
884- co_spawn (io_context, listener_v4 ( nullptr , nullptr ), detached );
885- co_spawn (io_context, listener_v6 ( nullptr , nullptr ), detached) ;
925+ std::printf ( " Incorrect arguments \n " );
926+ return 1 ;
886927 }
887928
888929 io_context.run ();
0 commit comments