SingBoxLib 1.1.2
See the version list below for details.
dotnet add package SingBoxLib --version 1.1.2
NuGet\Install-Package SingBoxLib -Version 1.1.2
<PackageReference Include="SingBoxLib" Version="1.1.2" />
paket add SingBoxLib --version 1.1.2
#r "nuget: SingBoxLib, 1.1.2"
// Install SingBoxLib as a Cake Addin #addin nuget:?package=SingBoxLib&version=1.1.2 // Install SingBoxLib as a Cake Tool #tool nuget:?package=SingBoxLib&version=1.1.2
<div align="center">
SingBoxLib
Configure and run sing-box with ease.
Based on sing-box
's official documentation.
</div>
Configuration examples
for more configuration examples, including Route Rules or Dns configuration, please refer to sing-box
's official documentation.
Mixed inbound with Trojan outbound and grpc transport with tls:
var config = new SingBoxConfig
{
Inbounds = new()
{
new MixedInbound
{
Listen = "127.0.0.1",
ListenPort = 2080
}
},
Outbounds = new()
{
new TrojanOutbound
{
Server = "yourserver.server",
Port = 443,
Password = "my top secret password!",
Transport = new GrpcTransport
{
ServiceName = "grpcSeviceNameGoesHere",
},
Tls = new()
{
Enabled = true,
ServerName = "sniGoesHere",
Alpn = new() { "listOfAplnsGoHere" }
}
}
}
};
Tun inbound:
- Please note that tun inbound requires your app to have administrator privileges.
- Always set
Route.AutoDetectInterface
to true when using tun inbound.
var config = new SingBoxConfig
{
... Outbounds, etc....
Inbounds = new()
{
new TunInbound
{
InterfaceName = "myTunInterface",
INet4Address = "172.19.0.1/30",
Stack = TunStacks.System,
Mtu = 1500,
AutoRoute = true,
}
},
Route = new()
{
AutoDetectInterface = true
}
};
Running
- In order to use this library for running
sing-box
you first need to obtain it's executable from its original repository. - You need to have the path to this executable and pass it to
SingBoxWrapper
's constructor.
var wrapper = new SingBoxWrapper("sing-box.exe");
if you need sing-box
's logs, you need to subscribe to the Onlog
event:
wrapper.OnLog += (sender, log) =>
{
Console.WriteLine(log);
};
you can pass a CancellationToken
to the SingBoxWrapper.StartAsync
method, if you cancel it, the sing-box
proccess will end. this parameter is optional.
// config is a SingBoxConfig instance.
var cts = new CancelationTokenSource();
await wrapper.StartAsync(config,cts.Token);
Parse profiles
At this moment the following formats are supported (the sing-box
itself can support more protocols):
VMess
VLess
Shadowsocks
Trojan
Socks
Http
var myProfileUrl = "trojan://myLovelyPassword@myserver.server:443?security=tls&sni=mySni&type=grpc&serviceName=myGrpcPath#MyTrojanServer";
var myProfile = ProfileParser.ParseProfileUrl(myProfileUrl);
// convert to outbound and use directly in sing-box config:
var myOutbound = myProfile.ToOutboundConfig();
Additionally you can convert parsed profiles back to string url:
var myProfileUrl = myProfile.ToProfileUrl();
Url testing
You can use UrlTester
and ParallelUrlTester
classes to easily test if the proxies are healthy and valid
var myProfileUrl = "trojan://myLovelyPassword@myserver.server:443?security=tls&sni=mySni&type=grpc&serviceName=myGrpcPath#MyTrojanServer";
var myProfile = ProfileParser.ParseProfileUrl(myProfileUrl);
var urlTester = new UrlTester(
new SingBoxWrapper("sing-box-path"),
// local port
2080,
// timeout in miliseconds
3000,
// retry count (will still do the retries even if proxy works, returns fastest result)
5,
// url to test using the proxy, defauts to http://cp.cloudflare.com, optional
null
);
var testResult = await urlTester.TestAsync(myProfile);
Console.WriteLine($"Success: {testResult.Success}, Delay: {testResult.Delay}");
Parallel:
var parallelTester = new ParallelUrlTester(
new SingBoxWrapper("sing-box-path"),
// A list of open local ports, must be equal or bigger than total test thread count
// make sure they are not occupied by other applications running on your system
new int[] { 2080, 2081, 2082, 2083, 2084, 2085 },
// max number of concurrent testing
6,
// timeout in miliseconds
3000,
// retry count (will still do the retries even if proxy works, returns fastest result)
5,
// url to test using the proxy, defauts to http://cp.cloudflare.com, optional
null);
List<ProfileItem> profilesToTest = GetMyProfilesFormSomewhere();
var results = new ConcurrentBag<UrlTestResult>();
await parallelTester.ParallelTestAsync(profilesToTest, new Progress<UrlTestResult>((result =>
{
results.Add(result);
})), default(CancellationToken));
Clash Api
- ClashApi can be used for accessing Traffic info, Logs,
sing-box
's internal url tester, selector outbound and more. - in order to be able to use this api, you first need to populate the
Experimental.ClashApi
property in yourSingBoxConfig
.
var config = new SingBoxConfig
{
... other config parameters....
Experimental = new()
{
ClashApi = new()
{
ExternalController = "127.0.0.1:9090",
}
}
};
After running the sing-box
's proccess with the above changes to your config, you shoud create an instance of ClashApiWrapper
:
using SingBoxLib.Runtime.Api.Clash;
....
var clashApi = new ClashApiWrapper("http://127.0.0.1:9090");
Getting logs using ClashApi
:
- the
GetLogs
methods return anIAsyncEnumerable<LogInfo>
- the
LogInfo
class contains two properties:Level
which indicates log level andPayload
which is a line of logs. - you can pass a
CancelationToken
for when you want to stop getting more logs. this parameter is optional.
await foreach(var logInfo in clashApi.GetLogs(cts.Token))
{
Console.WriteLine($"{logInfo.Level}>> {logInfo.Payload}");
}
Getting Traffic info using ClashApi
:
- the
GetTraffic
methods return anIAsyncEnumerable<TrafficInfo>
- the
LogInfo
class contains two properties:Up
andDown
, which indicate the traffic used the the past second inBytes
. - you can pass a
CancelationToken
for when you want to stop getting more traffic info. this parameter is optional.
await foreach(var trafficInfo in clashApi.GetTraffic(cts.Token))
{
Console.WriteLine($"Up: {trafficInfo.Up}, Down: {trafficInfo.Down}");
}
UrlTest a proxy using ClashApi
:
name
parameter is the same asTag
in Outbound configuration.
var delayInfo = clashApi.GetProxyDelay(name: "out-1", timeout: 1000, url: "http://cp.cloudflare.com");
Console.WriteLine(delayInfo.Delay);
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net7.0
- CliWrap (>= 3.6.4)
- Newtonsoft.Json (>= 13.0.3)
- UrlBase64 (>= 1.0.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on SingBoxLib:
Package | Downloads |
---|---|
Pouyan.SingBox
quieckly to create a vpn client that's support v2ray protocols |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on SingBoxLib:
Repository | Stars |
---|---|
Mahdi0024/ProxyCollector
Automatically collects and tests v2ray proxies and puts them in github for everyone to use.
|
Version | Downloads | Last updated |
---|---|---|
1.1.11 | 8,272 | 12/1/2023 |
1.1.10 | 1,061 | 11/15/2023 |
1.1.9 | 427 | 11/15/2023 |
1.1.8 | 461 | 11/15/2023 |
1.1.7 | 433 | 11/15/2023 |
1.1.6 | 449 | 11/14/2023 |
1.1.5 | 441 | 11/14/2023 |
1.1.4 | 463 | 10/27/2023 |
1.1.2 | 521 | 10/17/2023 |
1.1.1 | 1,280 | 9/30/2023 |
1.1.0 | 508 | 9/25/2023 |
1.0.9 | 547 | 9/23/2023 |
1.0.8 | 1,025 | 9/20/2023 |
1.0.7 | 691 | 9/18/2023 |
1.0.6 | 548 | 9/18/2023 |
1.0.5 | 513 | 9/18/2023 |
1.0.4 | 552 | 9/18/2023 |
1.0.3 | 522 | 9/13/2023 |