Skip to content

Commit 6120286

Browse files
committed
port number can be specified by user
1 parent 2ff4426 commit 6120286

File tree

2 files changed

+93
-15
lines changed

2 files changed

+93
-15
lines changed

README.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
Socks5 Server Demo implemented in C++20 coroutine with ASIO library
33

44
[简体中文版](#简体中文版)
5+
56
[繁體中文版](#繁體中文版)
67

78
## Supported Features
@@ -25,6 +26,18 @@ For example, username is ‘user’, password is ‘door’:
2526
./socks5demo user door
2627
```
2728

29+
### Specify Port Number
30+
Default port number is 1080. If the port number must be changed, for example, use 1180 instead:
31+
```
32+
./socks5demo 1180
33+
```
34+
35+
### Specify Port Number + Username / Password Authentication
36+
37+
```
38+
./socks5demo 1180 user door
39+
```
40+
2841
## Requirements
2942
- `ASIO` library must be installed first.
3043
- Compiler that supports C++20
@@ -67,6 +80,18 @@ cmake --build .
6780
./socks5demo user door
6881
```
6982

83+
### 指定端口号
84+
默认端口号是 1080,如果需要使用其他端口号,可以自行指定,例如使用 1180 端口号
85+
```
86+
./socks5demo 1180
87+
```
88+
89+
### 指定端口号 + 用户名 / 密码 认证模式
90+
91+
```
92+
./socks5demo 1180 user door
93+
```
94+
7095
## 编译前置要求
7196
- 必须先安装 `ASIO`
7297
- 支持C++20的编译器
@@ -111,6 +136,18 @@ cmake --build .
111136
./socks5demo user door
112137
```
113138

139+
### 指定通訊埠號
140+
預設通訊埠號是 1080,如果需要使用其他通訊埠號,可以自行指定,例如使用 1180 通訊埠號
141+
```
142+
./socks5demo 1180
143+
```
144+
145+
### 指定通訊埠號 + 用戶名稱 / 密碼 認證模式
146+
147+
```
148+
./socks5demo 1180 user door
149+
```
150+
114151
## 編譯前置要求
115152
- 必須事先裝好 C++庫 `ASIO`
116153
- 支援C++20的編譯器

src/main.cpp

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)