Compare commits

...

28 Commits
1.4.3 ... 1.4.4

Author SHA1 Message Date
Amazing_DM
b69ed09dd6 🚑 2020-05-07 19:33:34 +08:00
Amazing_DM
5276d90af0 Update README.zh-CN.md 2020-05-07 19:02:46 +08:00
Amazing_DM
bea9ce6583 Update README.md 2020-05-07 19:02:18 +08:00
Connection Refused
3b939ab984 Update zh-CN 2020-05-07 16:54:33 +08:00
Connection Refused
bebb904a43 Only use shadowsocks-windows-dynamic in some modes 2020-05-07 16:45:38 +08:00
Amazing_DM
895cc40c36 Bump versions to 1.4.4 2020-05-07 13:45:41 +08:00
Amazing_DM
577e0e01a7 :globe_with_meridians:完善内部中文 2020-05-07 13:37:19 +08:00
Amazing_DM
635654336d :lipstick:调整设置界面 2020-05-07 11:30:58 +08:00
Amazing_DM
90c44bcaf3 Update submodule 2020-05-07 08:51:34 +08:00
Amazing_DM
31d64f308c :bug:修复一个bug 2020-05-05 16:36:22 +08:00
Amazing_DM
8a0d64c135 :boom:停止对32位系统支持 2020-05-05 16:06:04 +08:00
Amazing_DM
76ad8187e0 :boom:停止对32位系统支持 2020-05-05 15:13:51 +08:00
Amazing_DM
663e8fdcc0 Update README.zh-CN.md 2020-05-05 11:09:31 +08:00
Amazing_DM
8140fba21e 2020-05-05 09:27:16 +08:00
Connection Refused
23d0970ed3 Update zh-CN 2020-05-04 17:04:20 +08:00
Connection Refused
64ce265872 Update README.md 2020-05-04 17:03:52 +08:00
Connection Refused
e83c4ca449 Update zh-CN 2020-05-04 17:01:57 +08:00
Connection Refused
e4befbf3f0 Update README.md 2020-05-04 17:00:05 +08:00
Connection Refused
3f4b03870f Add XMR donate method 2020-05-03 16:15:38 +08:00
Amazing_DM
ae0ac6595e Update submodule 2020-05-01 15:46:00 +08:00
Amazing_DM
2a0c2e9f83 Update submodule 2020-05-01 15:41:03 +08:00
Amazing_DM
e4eba0a386 Update README.zh-CN.md 2020-04-30 10:29:38 +08:00
Amazing_DM
5b6a0650ce Update README.md 2020-04-30 10:29:26 +08:00
Amazing_DM
1707764d39 Merge branch 'master' of https://github.com/NetchX/Netch 2020-04-30 10:15:53 +08:00
Amazing_DM
d62cd46094 Update submodule 2020-04-30 10:15:32 +08:00
Amazing_DM
e9f1110217 Merge pull request #267 from zhuzai123/master
Update SSRController.cs
2020-04-29 13:42:09 +08:00
He Houzhu
57706e6c96 Update SSRController.cs 2020-04-29 00:25:16 +08:00
Amazing_DM
6375407d53 :sparkles:支持Fake DNS
:globe_with_meridians:更新翻译
2020-04-28 15:56:25 +08:00
21 changed files with 299 additions and 271 deletions

View File

@@ -27,22 +27,14 @@ jobs:
run: |
.\build.ps1
New-Item -ItemType Directory -Path C:\builtfiles -Force > $null
Compress-Archive -Path Netch\bin\x64\Release\win-x64\* -DestinationPath C:\builtfiles\Netch.x64-${{ env.GITHUB_TAG_NAME }}.zip
echo "::set-env name=Netch64_SHA256::$(.\getSHA256.ps1 C:\builtfiles\Netch.x64-${{ env.GITHUB_TAG_NAME }}.zip)"
Compress-Archive -Path Netch\bin\x86\Release\win-x86\* -DestinationPath C:\builtfiles\Netch.x86-${{ env.GITHUB_TAG_NAME }}.zip
echo "::set-env name=Netch86_SHA256::$(.\getSHA256.ps1 C:\builtfiles\Netch.x86-${{ env.GITHUB_TAG_NAME }}.zip)"
Compress-Archive -Path Netch\bin\x64\Release\win-x64\* -DestinationPath C:\builtfiles\Netch-${{ env.GITHUB_TAG_NAME }}.zip
echo "::set-env name=Netch_SHA256::$(.\getSHA256.ps1 C:\builtfiles\Netch-${{ env.GITHUB_TAG_NAME }}.zip)"
- name: Upload Netch.x64
- name: Upload Netch
uses: actions/upload-artifact@v1
with:
name: Netch.x64
name: Netch
path: Netch\bin\x64\Release\win-x64
- name: Upload Netch.x86
uses: actions/upload-artifact@v1
with:
name: Netch.x86
path: Netch\bin\x86\Release\win-x86
# Create a new release: create a tag, then 'git push origin <tagname>', wait for it to build
- name: Create a new GitHub release if a new tag is pushed
@@ -52,8 +44,7 @@ jobs:
prerelease: true
draft: false
files: |
C:\builtfiles\Netch.x64-${{ env.GITHUB_TAG_NAME }}.zip
C:\builtfiles\Netch.x86-${{ env.GITHUB_TAG_NAME }}.zip
C:\builtfiles\Netch-${{ env.GITHUB_TAG_NAME }}.zip
body: |
[![](https://img.shields.io/badge/Telegram-Channel-blue)](https://t.me/Netch) [![](https://img.shields.io/badge/Telegram-Group-green)](https://t.me/Netch_Discuss_Group)
@@ -64,8 +55,7 @@ jobs:
## 文件校验
| 文件名 | SHA256 |
| :- | :- |
| <sub>Netch.x64-${{ env.GITHUB_TAG_NAME }}.zip</sub> | <sub>${{ env.Netch64_SHA256 }}</sub> |
| <sub>Netch.x86-${{ env.GITHUB_TAG_NAME }}.zip</sub> | <sub>${{ env.Netch86_SHA256 }}</sub> |
| <sub>Netch-${{ env.GITHUB_TAG_NAME }}.zip</sub> | <sub>${{ env.Netch_SHA256 }}</sub> |
if: startsWith(github.ref, 'refs/tags/')
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

View File

@@ -9,34 +9,18 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetchLib", "NetchLib\NetchL
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4B041B91-5790-4571-8C58-C63FFE4BC9F8}.Debug|Any CPU.ActiveCfg = Debug|x86
{4B041B91-5790-4571-8C58-C63FFE4BC9F8}.Debug|x64.ActiveCfg = Debug|x64
{4B041B91-5790-4571-8C58-C63FFE4BC9F8}.Debug|x64.Build.0 = Debug|x64
{4B041B91-5790-4571-8C58-C63FFE4BC9F8}.Debug|x86.ActiveCfg = Debug|x86
{4B041B91-5790-4571-8C58-C63FFE4BC9F8}.Debug|x86.Build.0 = Debug|x86
{4B041B91-5790-4571-8C58-C63FFE4BC9F8}.Release|Any CPU.ActiveCfg = Release|x86
{4B041B91-5790-4571-8C58-C63FFE4BC9F8}.Release|x64.ActiveCfg = Release|x64
{4B041B91-5790-4571-8C58-C63FFE4BC9F8}.Release|x64.Build.0 = Release|x64
{4B041B91-5790-4571-8C58-C63FFE4BC9F8}.Release|x86.ActiveCfg = Release|x86
{4B041B91-5790-4571-8C58-C63FFE4BC9F8}.Release|x86.Build.0 = Release|x86
{A8715AF4-ACC6-43F9-9381-4294C5360623}.Debug|Any CPU.ActiveCfg = Debug|x86
{A8715AF4-ACC6-43F9-9381-4294C5360623}.Debug|x64.ActiveCfg = Debug|x64
{A8715AF4-ACC6-43F9-9381-4294C5360623}.Debug|x64.Build.0 = Debug|x64
{A8715AF4-ACC6-43F9-9381-4294C5360623}.Debug|x86.ActiveCfg = Debug|x86
{A8715AF4-ACC6-43F9-9381-4294C5360623}.Debug|x86.Build.0 = Debug|x86
{A8715AF4-ACC6-43F9-9381-4294C5360623}.Release|Any CPU.ActiveCfg = Release|x86
{A8715AF4-ACC6-43F9-9381-4294C5360623}.Release|x64.ActiveCfg = Release|x64
{A8715AF4-ACC6-43F9-9381-4294C5360623}.Release|x64.Build.0 = Release|x64
{A8715AF4-ACC6-43F9-9381-4294C5360623}.Release|x86.ActiveCfg = Release|x86
{A8715AF4-ACC6-43F9-9381-4294C5360623}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -499,7 +499,7 @@ namespace nfapinet
* @param driverName The name of hooking driver, without ".sys" extension.
* @param pHandler Pointer to event handling object
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_init(String driverName, IntPtr pHandler);
public static NF_STATUS nf_init(String driverName, NF_EventHandler pHandler)
@@ -537,21 +537,21 @@ namespace nfapinet
* Stops the filtering thread, breaks all filtered connections and closes
* a connection with the hooking driver.
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern void nf_free();
/**
* Registers and starts a driver with specified name (without ".sys" extension)
* @param driverName
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_registerDriver(String driverName);
/**
* Unregisters a driver with specified name (without ".sys" extension)
* @param driverName
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_unRegisterDriver(String driverName);
@@ -564,7 +564,7 @@ namespace nfapinet
* @param id Connection identifier
* @param suspended true for suspend, false for resume
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_tcpSetConnectionState(ulong id, int suspended);
/**
@@ -573,7 +573,7 @@ namespace nfapinet
* @param buf Pointer to data buffer
* @param len Buffer length
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_tcpPostSend(ulong id, IntPtr buf, int len);
/**
@@ -582,14 +582,14 @@ namespace nfapinet
* @param buf Pointer to data buffer
* @param len Buffer length
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_tcpPostReceive(ulong id, IntPtr buf, int len);
/**
* Breaks the connection with given id.
* @param id Connection identifier
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_tcpClose(ulong id);
//
@@ -601,7 +601,7 @@ namespace nfapinet
* @param id Socket identifier
* @param suspended true for suspend, false for resume
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_udpSetConnectionState(ulong id, int suspended);
/**
@@ -611,7 +611,7 @@ namespace nfapinet
* @param buf Pointer to data buffer
* @param len Buffer length
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_udpPostSend(ulong id,
IntPtr remoteAddress,
IntPtr buf, int len,
@@ -624,7 +624,7 @@ namespace nfapinet
* @param buf Pointer to data buffer
* @param len Buffer length
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_udpPostReceive(ulong id,
IntPtr remoteAddress,
IntPtr buf, int len,
@@ -636,7 +636,7 @@ namespace nfapinet
* @param len Buffer length
* @param options IP options
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_ipPostReceive(
IntPtr buf, int len,
ref NF_IP_PACKET_OPTIONS options);
@@ -647,7 +647,7 @@ namespace nfapinet
* @param len Buffer length
* @param options IP options
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_ipPostSend(
IntPtr buf, int len,
ref NF_IP_PACKET_OPTIONS options);
@@ -661,7 +661,7 @@ namespace nfapinet
* @param pRule See <tt>NF_RULE</tt>
* @param toHead TRUE (1) - add rule to list head, FALSE (0) - add rule to tail
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
private static extern NF_STATUS nf_addRule(ref NF_RULE pRule, int toHead);
private static void updateAddressLength(ref byte[] buf)
@@ -694,7 +694,7 @@ namespace nfapinet
* @param pRule See <tt>NF_RULE</tt>
* @param toHead TRUE (1) - add rule to list head, FALSE (0) - add rule to tail
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
private static extern NF_STATUS nf_addRuleEx(ref NF_RULE_EX pRule, int toHead);
public static NF_STATUS nf_addRuleEx(NF_RULE_EX pRule, int toHead)
@@ -712,7 +712,7 @@ namespace nfapinet
* @param pRules Array of <tt>NF_RULE</tt> structures
* @param count Number of items in array
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
private static extern NF_STATUS nf_setRules(IntPtr pRules, int count);
public static NF_STATUS nf_setRules(NF_RULE[] rules)
@@ -744,7 +744,7 @@ namespace nfapinet
* @param pRules Array of <tt>NF_RULE</tt> structures
* @param count Number of items in array
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
private static extern NF_STATUS nf_setRulesEx(IntPtr pRules, int count);
public static NF_STATUS nf_setRulesEx(NF_RULE_EX[] rules)
@@ -774,34 +774,34 @@ namespace nfapinet
/**
* Removes all rules from driver.
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_deleteRules();
/**
* Sets the timeout for TCP connections and returns old timeout.
* @param timeout Timeout value in milliseconds. Specify zero value to disable timeouts.
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern UInt32 nf_setTCPTimeout(UInt32 timeout);
/**
* Disables indicating TCP packets to user mode for the specified endpoint
* @param id Socket identifier
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_tcpDisableFiltering(ulong id);
/**
* Disables indicating UDP packets to user mode for the specified endpoint
* @param id Socket identifier
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_udpDisableFiltering(ulong id);
/**
* Returns TRUE if the specified process acts as a local proxy, accepting the redirected TCP connections.
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
private static extern bool nf_tcpIsProxy(uint processId);
/**
@@ -811,37 +811,37 @@ namespace nfapinet
* @param nThreads Number of worker threads for NF_EventHandler events
* @param flags A combination of flags from <tt>NF_FLAGS</tt>
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern void nf_setOptions(uint nThreads, uint flags);
/**
* Complete TCP connect request pended using flag NF_PEND_CONNECT_REQUEST.
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_completeTCPConnectRequest(ulong id, ref NF_TCP_CONN_INFO pConnInfo);
/**
* Complete UDP connect request pended using flag NF_PEND_CONNECT_REQUEST.
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_completeUDPConnectRequest(ulong id, ref NF_UDP_CONN_REQUEST pConnInfo);
/**
* Returns in pConnInfo the properties of TCP connection with specified id.
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_getTCPConnInfo(ulong id, ref NF_TCP_CONN_INFO pConnInfo);
/**
* Returns in pConnInfo the properties of UDP socket with specified id.
**/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_getUDPConnInfo(ulong id, ref NF_UDP_CONN_INFO pConnInfo);
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
private static extern bool nf_getProcessNameW(uint processId, IntPtr buf, int len);
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
private static extern bool nf_getProcessNameFromKernel(uint processId, IntPtr buf, int len);
/**
@@ -880,13 +880,13 @@ namespace nfapinet
return "System";
}
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern void nf_adjustProcessPriviledges();
/*
* Set the event handler for IP filtering events
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
private static extern void nf_setIPEventHandler(IntPtr pHandler);
/*
@@ -910,51 +910,51 @@ namespace nfapinet
/**
* Add flow control context
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_addFlowCtl(ref NF_FLOWCTL_DATA pData, ref UInt32 pFcHandle);
/**
* Delete flow control context
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_deleteFlowCtl(UInt32 fcHandle);
/**
* Associate flow control context with TCP connection
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_setTCPFlowCtl(ulong id, UInt32 fcHandle);
/**
* Associate flow control context with UDP socket
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_setUDPFlowCtl(ulong id, UInt32 fcHandle);
/**
* Modify flow control context limits
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_modifyFlowCtl(UInt32 fcHandle, ref NF_FLOWCTL_DATA pData);
/**
* Get flow control context statistics as the numbers of in/out bytes
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_getFlowCtlStat(UInt32 fcHandle, ref NF_FLOWCTL_STAT pStat);
/**
* Get TCP connection statistics as the numbers of in/out bytes.
* The function can be called only from tcpClosed handler!
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_getTCPStat(ulong id, ref NF_FLOWCTL_STAT pStat);
/**
* Get UDP socket statistics as the numbers of in/out bytes.
* The function can be called only from udpClosed handler!
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_getUDPStat(ulong id, ref NF_FLOWCTL_STAT pStat);
public enum NF_SOCKET_OPTIONS
@@ -967,10 +967,10 @@ namespace nfapinet
TCP_SOCKET_WINDOW = 6
}
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_tcpSetSockOpt(ulong id, NF_SOCKET_OPTIONS optname, ref int optval, int optlen);
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS nf_tcpSetSockOpt(ulong id, NF_SOCKET_OPTIONS optname, IntPtr optval, int optlen);
public static NF_STATUS nf_tcpSetSockOpt(ulong id, NF_SOCKET_OPTIONS optname, bool optval)
@@ -982,7 +982,7 @@ namespace nfapinet
/**
* Add binding rule to driver
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
private static extern NF_STATUS
nf_addBindingRule(ref NF_BINDING_RULE pRule, int toHead);
@@ -999,14 +999,14 @@ namespace nfapinet
/**
* Delete all binding rules from driver
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern NF_STATUS
nf_deleteBindingRules();
/**
* Returns the type of attached driver (DT_WFP, DT_TDI or DT_UNKNOWN)
*/
[DllImport("nfapinet", CallingConvention = CallingConvention.Cdecl)]
[DllImport("bin\\nfapinet", CallingConvention = CallingConvention.Cdecl)]
public static extern UInt32
nf_getDriverType();
};

View File

@@ -1,7 +1,10 @@
using Netch.Forms;
using Netch.Utils;
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
namespace Netch.Controllers
@@ -27,11 +30,39 @@ namespace Netch.Controllers
public bool Start(Models.Server server, Models.Mode mode)
{
MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting Shadowsocks")}");
File.Delete("logging\\shadowsocks.log");
//从DLL启动Shaowsocks
if (Global.Settings.BootShadowsocksFromDLL && (mode.Type == 0 || mode.Type == 1 || mode.Type == 2 || mode.Type == 3))
{
State = Models.State.Starting;
var client = Encoding.UTF8.GetBytes($"0.0.0.0:{Global.Settings.Socks5LocalPort}");
var remote = Encoding.UTF8.GetBytes($"{server.Hostname}:{server.Port}");
var passwd = Encoding.UTF8.GetBytes($"{server.Password}");
var method = Encoding.UTF8.GetBytes($"{server.EncryptMethod}");
if (!NativeMethods.Shadowsocks.Info(client, remote, passwd, method))
{
State = Models.State.Stopped;
Logging.Info("DLL SS INFO 设置失败!");
return false;
}
Logging.Info("DLL SS INFO 设置成功!");
if (!NativeMethods.Shadowsocks.Start())
{
State = Models.State.Stopped;
Logging.Info("DLL SS 启动失败!");
return false;
}
Logging.Info("DLL SS 启动成功!");
State = Models.State.Started;
return true;
}
if (!File.Exists("bin\\Shadowsocks.exe"))
{
return false;
}
Instance = MainController.GetProcess();
Instance.StartInfo.FileName = "bin\\Shadowsocks.exe";
@@ -90,6 +121,8 @@ namespace Netch.Controllers
{
Instance.Kill();
}
if (Global.Settings.BootShadowsocksFromDLL)
NativeMethods.Shadowsocks.Stop();
}
catch (Exception e)
{
@@ -101,7 +134,7 @@ namespace Netch.Controllers
{
if (!string.IsNullOrWhiteSpace(e.Data))
{
// File.AppendAllText("logging\\shadowsocks.log", $"{e.Data}\r\n");
File.AppendAllText("logging\\shadowsocks.log", $"{e.Data}\r\n");
if (State == Models.State.Starting)
{

View File

@@ -27,6 +27,9 @@ namespace Netch.Controllers
public bool Start(Models.Server server, Models.Mode mode)
{
MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting ShadowsocksR")}");
File.Delete("logging\\shadowsocksr.log");
if (!File.Exists("bin\\ShadowsocksR.exe"))
{
return false;
@@ -34,7 +37,7 @@ namespace Netch.Controllers
Instance = MainController.GetProcess();
Instance.StartInfo.FileName = "bin\\ShadowsocksR.exe";
Instance.StartInfo.Arguments = $"-s {server.Hostname} -p {server.Port} -k \"{server.Password}\" -m {server.EncryptMethod} -t 600";
Instance.StartInfo.Arguments = $"-s {server.Hostname} -p {server.Port} -k \"{server.Password}\" -m {server.EncryptMethod} -t 120";
if (!string.IsNullOrEmpty(server.Protocol))
{

View File

@@ -430,6 +430,10 @@ namespace Netch.Controllers
dns = "127.0.0.1";
//dns = "1.1.1.1,1.0.0.1";
}
if (Global.Settings.TUNTAP.UseFakeDNS)
{
dns += " -fakeDns";
}
if (server.Type == "Socks5")
{
@@ -449,6 +453,8 @@ namespace Netch.Controllers
Instance.ErrorDataReceived += OnOutputDataReceived;
Instance.OutputDataReceived += OnOutputDataReceived;
Logging.Info(Instance.StartInfo.Arguments);
State = Models.State.Starting;
Instance.Start();
Instance.BeginErrorReadLine();

View File

@@ -26,7 +26,7 @@ namespace Netch.Controllers
public const string Name = @"Netch";
public const string Copyright = @"Copyright © 2019 - 2020";
public const string Version = @"1.4.3";
public const string Version = @"1.4.4";
public async void Check(bool notifyNoFound, bool isPreRelease)
{

View File

@@ -173,7 +173,7 @@ namespace Netch.Forms
if (splited.Length >= 1)
{
mode.Remark = splited[0].Trim();
mode.Remark = Utils.i18N.Translate(splited[0].Trim());
}
if (splited.Length >= 2)
@@ -255,13 +255,17 @@ namespace Netch.Forms
private void SaveConfigs()
{
Global.Settings.ServerComboBoxSelectedIndex = ServerComboBox.SelectedIndex;
if (ModeComboBox.Tag is object[] list)
if (ModeComboBox.SelectedItem != null)
{
Global.Settings.ModeComboBoxSelectedIndex = list.ToList().IndexOf(ModeComboBox.SelectedItem);
}
else
{
Global.Settings.ModeComboBoxSelectedIndex = ModeComboBox.Items.IndexOf(ModeComboBox.SelectedItem);
if (ModeComboBox.Tag is object[] list)
{
Global.Settings.ModeComboBoxSelectedIndex = list.ToList().IndexOf(ModeComboBox.SelectedItem);
}
else
{
Global.Settings.ModeComboBoxSelectedIndex = ModeComboBox.Items.IndexOf(ModeComboBox.SelectedItem);
}
}
Utils.Configuration.Save();
}

View File

@@ -38,6 +38,7 @@
this.Socks5PortLabel = new System.Windows.Forms.Label();
this.Socks5PortTextBox = new System.Windows.Forms.TextBox();
this.TUNTAPGroupBox = new System.Windows.Forms.GroupBox();
this.UseFakeDNSCheckBox = new System.Windows.Forms.CheckBox();
this.TUNTAPProxyDNSCheckBox = new System.Windows.Forms.CheckBox();
this.TUNTAPUseCustomDNSCheckBox = new System.Windows.Forms.CheckBox();
this.TUNTAPDNSLabel = new System.Windows.Forms.Label();
@@ -51,6 +52,9 @@
this.ControlButton = new System.Windows.Forms.Button();
this.GlobalBypassIPsButton = new System.Windows.Forms.Button();
this.BehaviorGroupBox = new System.Windows.Forms.GroupBox();
this.BootShadowsocksFromDLLCheckBox = new System.Windows.Forms.CheckBox();
this.AclAddr = new System.Windows.Forms.TextBox();
this.AclLabel = new System.Windows.Forms.Label();
this.DetectionInterval_Label = new System.Windows.Forms.Label();
this.DetectionInterval_TextBox = new System.Windows.Forms.TextBox();
this.EnableStartedTcping_CheckBox = new System.Windows.Forms.CheckBox();
@@ -70,8 +74,6 @@
this.StartWhenOpenedCheckBox = new System.Windows.Forms.CheckBox();
this.StopWhenExitedCheckBox = new System.Windows.Forms.CheckBox();
this.ExitWhenClosedCheckBox = new System.Windows.Forms.CheckBox();
this.AclAddr = new System.Windows.Forms.TextBox();
this.AclLabel = new System.Windows.Forms.Label();
this.PortGroupBox.SuspendLayout();
this.TUNTAPGroupBox.SuspendLayout();
this.BehaviorGroupBox.SuspendLayout();
@@ -157,6 +159,7 @@
//
// TUNTAPGroupBox
//
this.TUNTAPGroupBox.Controls.Add(this.UseFakeDNSCheckBox);
this.TUNTAPGroupBox.Controls.Add(this.TUNTAPProxyDNSCheckBox);
this.TUNTAPGroupBox.Controls.Add(this.TUNTAPUseCustomDNSCheckBox);
this.TUNTAPGroupBox.Controls.Add(this.TUNTAPDNSLabel);
@@ -174,10 +177,20 @@
this.TUNTAPGroupBox.TabStop = false;
this.TUNTAPGroupBox.Text = "TUN/TAP";
//
// UseFakeDNSCheckBox
//
this.UseFakeDNSCheckBox.AutoSize = true;
this.UseFakeDNSCheckBox.Location = new System.Drawing.Point(10, 160);
this.UseFakeDNSCheckBox.Name = "UseFakeDNSCheckBox";
this.UseFakeDNSCheckBox.Size = new System.Drawing.Size(316, 21);
this.UseFakeDNSCheckBox.TabIndex = 11;
this.UseFakeDNSCheckBox.Text = "Use Fake DNS (Suggest open if NTT is Udpblock)";
this.UseFakeDNSCheckBox.UseVisualStyleBackColor = true;
//
// TUNTAPProxyDNSCheckBox
//
this.TUNTAPProxyDNSCheckBox.AutoSize = true;
this.TUNTAPProxyDNSCheckBox.Location = new System.Drawing.Point(120, 162);
this.TUNTAPProxyDNSCheckBox.Location = new System.Drawing.Point(261, 139);
this.TUNTAPProxyDNSCheckBox.Name = "TUNTAPProxyDNSCheckBox";
this.TUNTAPProxyDNSCheckBox.Size = new System.Drawing.Size(153, 21);
this.TUNTAPProxyDNSCheckBox.TabIndex = 10;
@@ -187,7 +200,7 @@
// TUNTAPUseCustomDNSCheckBox
//
this.TUNTAPUseCustomDNSCheckBox.AutoSize = true;
this.TUNTAPUseCustomDNSCheckBox.Location = new System.Drawing.Point(120, 138);
this.TUNTAPUseCustomDNSCheckBox.Location = new System.Drawing.Point(10, 139);
this.TUNTAPUseCustomDNSCheckBox.Name = "TUNTAPUseCustomDNSCheckBox";
this.TUNTAPUseCustomDNSCheckBox.Size = new System.Drawing.Size(127, 21);
this.TUNTAPUseCustomDNSCheckBox.TabIndex = 9;
@@ -266,7 +279,7 @@
// ControlButton
//
this.ControlButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.ControlButton.Location = new System.Drawing.Point(781, 356);
this.ControlButton.Location = new System.Drawing.Point(804, 356);
this.ControlButton.Name = "ControlButton";
this.ControlButton.Size = new System.Drawing.Size(75, 23);
this.ControlButton.TabIndex = 11;
@@ -287,6 +300,7 @@
//
// BehaviorGroupBox
//
this.BehaviorGroupBox.Controls.Add(this.BootShadowsocksFromDLLCheckBox);
this.BehaviorGroupBox.Controls.Add(this.AclAddr);
this.BehaviorGroupBox.Controls.Add(this.AclLabel);
this.BehaviorGroupBox.Controls.Add(this.DetectionInterval_Label);
@@ -310,15 +324,42 @@
this.BehaviorGroupBox.Controls.Add(this.ExitWhenClosedCheckBox);
this.BehaviorGroupBox.Location = new System.Drawing.Point(438, 12);
this.BehaviorGroupBox.Name = "BehaviorGroupBox";
this.BehaviorGroupBox.Size = new System.Drawing.Size(420, 333);
this.BehaviorGroupBox.Size = new System.Drawing.Size(441, 333);
this.BehaviorGroupBox.TabIndex = 8;
this.BehaviorGroupBox.TabStop = false;
this.BehaviorGroupBox.Text = "Behavior";
//
// BootShadowsocksFromDLLCheckBox
//
this.BootShadowsocksFromDLLCheckBox.AutoSize = true;
this.BootShadowsocksFromDLLCheckBox.Location = new System.Drawing.Point(12, 128);
this.BootShadowsocksFromDLLCheckBox.Name = "BootShadowsocksFromDLLCheckBox";
this.BootShadowsocksFromDLLCheckBox.Size = new System.Drawing.Size(297, 21);
this.BootShadowsocksFromDLLCheckBox.TabIndex = 21;
this.BootShadowsocksFromDLLCheckBox.Text = "Boot Shadowsocks from DLL(No support ACL)";
this.BootShadowsocksFromDLLCheckBox.UseVisualStyleBackColor = true;
//
// AclAddr
//
this.AclAddr.Location = new System.Drawing.Point(117, 274);
this.AclAddr.Name = "AclAddr";
this.AclAddr.Size = new System.Drawing.Size(315, 23);
this.AclAddr.TabIndex = 19;
this.AclAddr.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// AclLabel
//
this.AclLabel.AutoSize = true;
this.AclLabel.Location = new System.Drawing.Point(9, 277);
this.AclLabel.Name = "AclLabel";
this.AclLabel.Size = new System.Drawing.Size(78, 17);
this.AclLabel.TabIndex = 20;
this.AclLabel.Text = "Custom ACL";
//
// DetectionInterval_Label
//
this.DetectionInterval_Label.AutoSize = true;
this.DetectionInterval_Label.Location = new System.Drawing.Point(230, 151);
this.DetectionInterval_Label.Location = new System.Drawing.Point(230, 193);
this.DetectionInterval_Label.Name = "DetectionInterval_Label";
this.DetectionInterval_Label.Size = new System.Drawing.Size(128, 17);
this.DetectionInterval_Label.TabIndex = 18;
@@ -326,16 +367,16 @@
//
// DetectionInterval_TextBox
//
this.DetectionInterval_TextBox.Location = new System.Drawing.Point(364, 148);
this.DetectionInterval_TextBox.Location = new System.Drawing.Point(364, 190);
this.DetectionInterval_TextBox.Name = "DetectionInterval_TextBox";
this.DetectionInterval_TextBox.Size = new System.Drawing.Size(47, 23);
this.DetectionInterval_TextBox.Size = new System.Drawing.Size(68, 23);
this.DetectionInterval_TextBox.TabIndex = 17;
this.DetectionInterval_TextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// EnableStartedTcping_CheckBox
//
this.EnableStartedTcping_CheckBox.AutoSize = true;
this.EnableStartedTcping_CheckBox.Location = new System.Drawing.Point(152, 150);
this.EnableStartedTcping_CheckBox.Location = new System.Drawing.Point(152, 192);
this.EnableStartedTcping_CheckBox.Name = "EnableStartedTcping_CheckBox";
this.EnableStartedTcping_CheckBox.Size = new System.Drawing.Size(66, 21);
this.EnableStartedTcping_CheckBox.TabIndex = 15;
@@ -345,7 +386,7 @@
// DelayTestAfterStartup_Label
//
this.DelayTestAfterStartup_Label.AutoSize = true;
this.DelayTestAfterStartup_Label.Location = new System.Drawing.Point(6, 151);
this.DelayTestAfterStartup_Label.Location = new System.Drawing.Point(9, 193);
this.DelayTestAfterStartup_Label.Name = "DelayTestAfterStartup_Label";
this.DelayTestAfterStartup_Label.Size = new System.Drawing.Size(141, 17);
this.DelayTestAfterStartup_Label.TabIndex = 16;
@@ -354,18 +395,18 @@
// BypassModeCheckBox
//
this.BypassModeCheckBox.AutoSize = true;
this.BypassModeCheckBox.Location = new System.Drawing.Point(276, 307);
this.BypassModeCheckBox.Location = new System.Drawing.Point(12, 102);
this.BypassModeCheckBox.Name = "BypassModeCheckBox";
this.BypassModeCheckBox.Size = new System.Drawing.Size(135, 21);
this.BypassModeCheckBox.Size = new System.Drawing.Size(160, 21);
this.BypassModeCheckBox.TabIndex = 14;
this.BypassModeCheckBox.Text = "进程代理白名单模式";
this.BypassModeCheckBox.Text = "Process whitelist mode";
this.BypassModeCheckBox.UseVisualStyleBackColor = true;
this.BypassModeCheckBox.CheckedChanged += new System.EventHandler(this.BypassModeCheckBox_CheckedChanged);
//
// Redirector2checkBox
//
this.Redirector2checkBox.AutoSize = true;
this.Redirector2checkBox.Location = new System.Drawing.Point(152, 306);
this.Redirector2checkBox.Location = new System.Drawing.Point(148, 310);
this.Redirector2checkBox.Name = "Redirector2checkBox";
this.Redirector2checkBox.Size = new System.Drawing.Size(118, 21);
this.Redirector2checkBox.TabIndex = 11;
@@ -375,7 +416,7 @@
// ExperimentalFunction_Label
//
this.ExperimentalFunction_Label.AutoSize = true;
this.ExperimentalFunction_Label.Location = new System.Drawing.Point(6, 307);
this.ExperimentalFunction_Label.Location = new System.Drawing.Point(9, 310);
this.ExperimentalFunction_Label.Name = "ExperimentalFunction_Label";
this.ExperimentalFunction_Label.Size = new System.Drawing.Size(133, 17);
this.ExperimentalFunction_Label.TabIndex = 13;
@@ -383,16 +424,16 @@
//
// STUN_ServerPortTextBox
//
this.STUN_ServerPortTextBox.Location = new System.Drawing.Point(117, 206);
this.STUN_ServerPortTextBox.Location = new System.Drawing.Point(117, 245);
this.STUN_ServerPortTextBox.Name = "STUN_ServerPortTextBox";
this.STUN_ServerPortTextBox.Size = new System.Drawing.Size(294, 23);
this.STUN_ServerPortTextBox.Size = new System.Drawing.Size(315, 23);
this.STUN_ServerPortTextBox.TabIndex = 8;
this.STUN_ServerPortTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(6, 209);
this.label2.Location = new System.Drawing.Point(9, 248);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(110, 17);
this.label2.TabIndex = 12;
@@ -401,7 +442,7 @@
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(6, 180);
this.label1.Location = new System.Drawing.Point(9, 222);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(82, 17);
this.label1.TabIndex = 10;
@@ -419,9 +460,9 @@
//
// STUN_ServerTextBox
//
this.STUN_ServerTextBox.Location = new System.Drawing.Point(117, 177);
this.STUN_ServerTextBox.Location = new System.Drawing.Point(117, 216);
this.STUN_ServerTextBox.Name = "STUN_ServerTextBox";
this.STUN_ServerTextBox.Size = new System.Drawing.Size(294, 23);
this.STUN_ServerTextBox.Size = new System.Drawing.Size(315, 23);
this.STUN_ServerTextBox.TabIndex = 11;
this.STUN_ServerTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
@@ -438,7 +479,7 @@
// ProfileCount_Label
//
this.ProfileCount_Label.AutoSize = true;
this.ProfileCount_Label.Location = new System.Drawing.Point(6, 123);
this.ProfileCount_Label.Location = new System.Drawing.Point(9, 168);
this.ProfileCount_Label.Name = "ProfileCount_Label";
this.ProfileCount_Label.Size = new System.Drawing.Size(79, 17);
this.ProfileCount_Label.TabIndex = 8;
@@ -446,9 +487,9 @@
//
// ProfileCount_TextBox
//
this.ProfileCount_TextBox.Location = new System.Drawing.Point(203, 120);
this.ProfileCount_TextBox.Location = new System.Drawing.Point(206, 165);
this.ProfileCount_TextBox.Name = "ProfileCount_TextBox";
this.ProfileCount_TextBox.Size = new System.Drawing.Size(208, 23);
this.ProfileCount_TextBox.Size = new System.Drawing.Size(226, 23);
this.ProfileCount_TextBox.TabIndex = 9;
this.ProfileCount_TextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
@@ -496,28 +537,11 @@
this.ExitWhenClosedCheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.ExitWhenClosedCheckBox.UseVisualStyleBackColor = true;
//
// AclAddr
//
this.AclAddr.Location = new System.Drawing.Point(117, 235);
this.AclAddr.Name = "AclAddr";
this.AclAddr.Size = new System.Drawing.Size(294, 23);
this.AclAddr.TabIndex = 19;
this.AclAddr.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// AclLabel
//
this.AclLabel.AutoSize = true;
this.AclLabel.Location = new System.Drawing.Point(6, 238);
this.AclLabel.Name = "AclLabel";
this.AclLabel.Size = new System.Drawing.Size(78, 17);
this.AclLabel.TabIndex = 20;
this.AclLabel.Text = "Custom ACL";
//
// SettingForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(868, 390);
this.ClientSize = new System.Drawing.Size(891, 390);
this.Controls.Add(this.BehaviorGroupBox);
this.Controls.Add(this.PortGroupBox);
this.Controls.Add(this.GlobalBypassIPsButton);
@@ -588,5 +612,7 @@
private System.Windows.Forms.TextBox RedirectorTextBox;
private System.Windows.Forms.TextBox AclAddr;
private System.Windows.Forms.Label AclLabel;
private System.Windows.Forms.CheckBox UseFakeDNSCheckBox;
private System.Windows.Forms.CheckBox BootShadowsocksFromDLLCheckBox;
}
}

View File

@@ -52,8 +52,11 @@ namespace Netch.Forms
TUNTAPGatewayLabel.Text = Utils.i18N.Translate(TUNTAPGatewayLabel.Text);
TUNTAPUseCustomDNSCheckBox.Text = Utils.i18N.Translate(TUNTAPUseCustomDNSCheckBox.Text);
TUNTAPProxyDNSCheckBox.Text = Utils.i18N.Translate(TUNTAPProxyDNSCheckBox.Text);
UseFakeDNSCheckBox.Text = Utils.i18N.Translate(UseFakeDNSCheckBox.Text);
GlobalBypassIPsButton.Text = Utils.i18N.Translate(GlobalBypassIPsButton.Text);
ControlButton.Text = Utils.i18N.Translate(ControlButton.Text);
BypassModeCheckBox.Text = Utils.i18N.Translate(BypassModeCheckBox.Text);
BootShadowsocksFromDLLCheckBox.Text = Utils.i18N.Translate(BootShadowsocksFromDLLCheckBox.Text);
ExitWhenClosedCheckBox.Checked = Global.Settings.ExitWhenClosed;
StopWhenExitedCheckBox.Checked = Global.Settings.StopWhenExited;
@@ -65,6 +68,7 @@ namespace Netch.Forms
BypassModeCheckBox.Checked = Global.Settings.ProcessBypassMode;
EnableStartedTcping_CheckBox.Checked = Global.Settings.StartedTcping;
DetectionInterval_TextBox.Text = Global.Settings.StartedTcping_Interval.ToString();
BootShadowsocksFromDLLCheckBox.Checked = Global.Settings.BootShadowsocksFromDLL;
Socks5PortTextBox.Text = Global.Settings.Socks5LocalPort.ToString();
HTTPPortTextBox.Text = Global.Settings.HTTPLocalPort.ToString();
@@ -76,6 +80,7 @@ namespace Netch.Forms
TUNTAPUseCustomDNSCheckBox.Checked = Global.Settings.TUNTAP.UseCustomDNS;
TUNTAPProxyDNSCheckBox.Checked = Global.Settings.TUNTAP.ProxyDNS;
UseFakeDNSCheckBox.Checked = Global.Settings.TUNTAP.UseFakeDNS;
BehaviorGroupBox.Text = Utils.i18N.Translate(BehaviorGroupBox.Text);
ExitWhenClosedCheckBox.Text = Utils.i18N.Translate(ExitWhenClosedCheckBox.Text);
@@ -158,7 +163,8 @@ namespace Netch.Forms
Global.Settings.RunAtStartup = RunAtStartup.Checked;
Global.Settings.UseRedirector2 = Redirector2checkBox.Checked;
Global.Settings.ProcessBypassMode = BypassModeCheckBox.Checked;
Global.Settings.StartedTcping = EnableStartedTcping_CheckBox.Checked;
Global.Settings.BootShadowsocksFromDLL = BootShadowsocksFromDLLCheckBox.Checked;
// 开机自启判断
TaskSchedulerClass scheduler = new TaskSchedulerClass();
@@ -383,6 +389,7 @@ namespace Netch.Forms
Global.Settings.TUNTAP.UseCustomDNS = TUNTAPUseCustomDNSCheckBox.Checked;
Global.Settings.TUNTAP.ProxyDNS = TUNTAPProxyDNSCheckBox.Checked;
Global.Settings.TUNTAP.UseFakeDNS = UseFakeDNSCheckBox.Checked;
Utils.Configuration.Save();
MessageBox.Show(Utils.i18N.Translate("Saved"), Utils.i18N.Translate("Information"), MessageBoxButtons.OK, MessageBoxIcon.Information);

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Globalization;
namespace Netch.Models
{
@@ -41,7 +42,32 @@ namespace Netch.Models
/// <returns>备注</returns>
public override string ToString()
{
return string.Format("[{0}] {1}", Type + 1, Remark);
if (CultureInfo.CurrentCulture.Name == "zh-CN")
{
string Stype;
if (Type == 0)
{
Stype = "[进程模式] ";
}
else if (Type == 1)
{
Stype = "[TUN/TAP 黑] ";
}
else if (Type == 2)
{
Stype = "[TUN/TAP 白] ";
}
else
{
Stype = "";
}
return string.Format("{0}{1}", Stype, Remark);
}
else
{
return string.Format("[{0}] {1}", Type + 1, Remark);
}
}
/// <summary>

View File

@@ -36,6 +36,11 @@ namespace Netch.Models
/// 模式2下是否代理DNS
/// </summary>
public bool ProxyDNS = false;
/// <summary>
/// 使用Fake DNS
/// </summary>
public bool UseFakeDNS = false;
}
/// <summary>
@@ -167,7 +172,7 @@ namespace Netch.Models
/// <summary>
/// 是否启用启动后延迟测试
/// </summary>
public bool StartedTcping = false;
public bool StartedTcping = true;
/// <summary>
/// 启动后延迟测试间隔/秒
@@ -179,5 +184,9 @@ namespace Netch.Models
/// </summary>
public string ACL = "https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/banAD.acl";
/// <summary>
/// 是否使用DLL启动Shadowsocks
/// </summary>
public bool BootShadowsocksFromDLL = false;
}
}

View File

@@ -63,5 +63,15 @@ namespace Netch
/// <returns>是否成功</returns>
[DllImport("bin\\sysproxy", CallingConvention = CallingConvention.Cdecl)]
public static extern bool SetURL([MarshalAs(UnmanagedType.LPTStr)] string remote);
public class Shadowsocks
{
[DllImport("bin\\shadowsocks-windows-dynamic", CallingConvention = CallingConvention.Cdecl)]
public static extern bool Info(byte[] client, byte[] remote, byte[] passwd, byte[] method);
[DllImport("bin\\shadowsocks-windows-dynamic", CallingConvention = CallingConvention.Cdecl)]
public static extern bool Start();
[DllImport("bin\\shadowsocks-windows-dynamic", CallingConvention = CallingConvention.Cdecl)]
public static extern void Stop();
}
}
}

View File

@@ -9,9 +9,10 @@
<StartupObject>Netch.Netch</StartupObject>
<ApplicationManifest>App.manifest</ApplicationManifest>
<ApplicationIcon>Netch.ico</ApplicationIcon>
<Platforms>x86;x64</Platforms>
<Platforms>x64</Platforms>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<LangVersion>latest</LangVersion>
<PackageProjectUrl>https://github.com/NetchX/Netch</PackageProjectUrl>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -23,23 +24,6 @@
<NoWarn />
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
<DefineConstants>DEBUG;TRACE</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoWarn />
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningsAsErrors />
<OutputPath>bin\x86\Debug\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoWarn />
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningsAsErrors />
<OutputPath>bin\x86\Release\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoWarn />
@@ -107,8 +91,8 @@
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<Target Condition="'$(VisualStudioDir)' != ''" Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="@ECHO OFF&#xD;&#xA;RD /S /Q $(TargetDir)bin &gt; NUL 2&gt;&amp;1&#xD;&#xA;RD /S /Q $(TargetDir)i18n &gt; NUL 2&gt;&amp;1&#xD;&#xA;RD /S /Q $(TargetDir)mode &gt; NUL 2&gt;&amp;1&#xD;&#xA;&#xD;&#xA;MKDIR $(TargetDir)bin &gt; NUL 2&gt;&amp;1&#xD;&#xA;MKDIR $(TargetDir)i18n &gt; NUL 2&gt;&amp;1&#xD;&#xA;MKDIR $(TargetDir)mode &gt; NUL 2&gt;&amp;1&#xD;&#xA;&#xD;&#xA;COPY /Y $(SolutionDir)binaries\$(PlatformName)\* $(TargetDir)bin &gt; NUL 2&gt;&amp;1&#xD;&#xA;COPY /Y $(SolutionDir)binaries\* $(TargetDir)bin &gt; NUL 2&gt;&amp;1&#xD;&#xA;MOVE /Y $(TargetDir)bin\nfapinet.dll $(TargetDir)nfapinet.dll &gt; NUL 2&gt;&amp;1&#xD;&#xA;COPY /Y $(SolutionDir)translations\i18n\* $(TargetDir)i18n &gt; NUL 2&gt;&amp;1&#xD;&#xA;COPY /Y $(SolutionDir)modes\mode\*.txt $(TargetDir)mode &gt; NUL 2&gt;&amp;1&#xD;&#xA;MKDIR $(TargetDir)bin\tap-driver &gt; NUL 2&gt;&amp;1&#xD;&#xA;COPY /Y $(SolutionDir)binaries\tap-driver\* $(TargetDir)bin\tap-driver &gt; NUL 2&gt;&amp;1" />
</Target>
<ProjectExtensions><VisualStudio><UserProperties /></VisualStudio></ProjectExtensions>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="@ECHO OFF&#xD;&#xA;RD /S /Q $(TargetDir)bin &gt; NUL 2&gt;&amp;1&#xD;&#xA;RD /S /Q $(TargetDir)i18n &gt; NUL 2&gt;&amp;1&#xD;&#xA;RD /S /Q $(TargetDir)mode &gt; NUL 2&gt;&amp;1&#xD;&#xA;&#xD;&#xA;MKDIR $(TargetDir)bin &gt; NUL 2&gt;&amp;1&#xD;&#xA;MKDIR $(TargetDir)i18n &gt; NUL 2&gt;&amp;1&#xD;&#xA;MKDIR $(TargetDir)mode &gt; NUL 2&gt;&amp;1&#xD;&#xA;&#xD;&#xA;COPY /Y $(SolutionDir)binaries\* $(TargetDir)bin &gt; NUL 2&gt;&amp;1&#xD;&#xA;COPY /Y $(SolutionDir)translations\i18n\* $(TargetDir)i18n &gt; NUL 2&gt;&amp;1&#xD;&#xA;COPY /Y $(SolutionDir)modes\mode\* $(TargetDir)mode &gt; NUL 2&gt;&amp;1&#xD;&#xA;MKDIR $(TargetDir)bin\tap-driver &gt; NUL 2&gt;&amp;1&#xD;&#xA;COPY /Y $(SolutionDir)binaries\tap-driver\* $(TargetDir)bin\tap-driver &gt; NUL 2&gt;&amp;1&#xD;&#xA;&#xD;&#xA;DEL / f $(TargetDir)\*.config&#xD;&#xA;DEL / f $(TargetDir)\*.pdb" />
</Target>
</Project>

View File

@@ -29,7 +29,7 @@
"SetupBypass": "设置绕行规则",
"Test failed": "测试失败",
"Starting update subscription": "正在更新订阅",
"Starting update ACL": "正在更新ACL",
"Starting update ACL": "正在更新 ACL",
"Subscription updated": "订阅更新完毕",
"Register driver": "正在注册驱动",
@@ -93,10 +93,10 @@
"Update ACL with proxy": "使用代理更新 ACL 规则",
"ACL updated successfully": "ACL 更新成功",
"ACL update failed": "ACL更新失败",
"Reinstall Tap driver": "重新安装Tap驱动",
"Reinstall Tap driver successfully": "重装Tap驱动成功",
"Reinstall Tap driver failed": "重装Tap驱动失败",
"Reinstalling Tap driver": "正在重装Tap驱动",
"Reinstall Tap driver": "重新安装 TUN/TAP 驱动",
"Reinstall Tap driver successfully": "重装 TUN/TAP 驱动成功",
"Reinstall Tap driver failed": "重装 TUN/TAP 驱动失败",
"Reinstalling Tap driver": "正在重装 TUN/TAP 驱动",
"About": "关于",
"Telegram Channel": "Telegram 频道",
@@ -154,6 +154,7 @@
"Gateway": "网关",
"Use Custom DNS": "使用自定义 DNS",
"Proxy DNS in Mode 2": "在模式 2 下代理 DNS",
"Use Fake DNS (Suggest open if NTT is Udpblock)": "使用 Fake DNS (建议节点 NAT 测试为 UdpBlocked 时开启)",
"Behavior": "行为",
"Exit when closed": "关闭时退出",
"Stop when exited": "退出时停止",
@@ -165,17 +166,26 @@
"STUN_ServerPort value illegal. Try again.": "STUN 端口数值非法。请重试。",
"Detection interval value illegal. Try again.": "检测间隔值非法。请重试。",
"TUN/TAP driver is not detected. Is it installed now?": "未检测到 TUN/TAP 驱动,是否现在安装?",
"Failed to set the system proxy, it may be caused by the lack of dependent programs. Do you want to jump to Netch's official website to download dependent programs?": "设置系统代理失败可能是缺少依赖导致是否跳转Netch官网下载依赖程序",
"Failed to set the system proxy, it may be caused by the lack of dependent programs. Do you want to jump to Netch's official website to download dependent programs?": "设置系统代理失败,可能是缺少依赖导致,是否跳转 Netch 官网下载依赖程序?",
"Experimental function": "实验性功能",
"Delay test after startup": "启动后延迟测试",
"Enable": "启用",
"Detection interval(/s)": "检测间隔(/秒)",
"Custom ACL": "自定义 ACL 规则",
"Process whitelist mode": "进程白名单模式",
"Boot Shadowsocks from DLL(No support ACL)": "SS DLL推荐使用不支持 ACL",
"Profile": "配置名",
"Profiles": "配置",
"None": "无",
"Show": "显示",
"Exit": "退出"
"Exit": "退出",
"Bypass LAN": "[网页代理] 绕过局域网",
"Bypass LAN (Non System Proxy)": "[网页代理] 绕过局域网(不设置系统代理)",
"Bypass LAN (TUN/TAP)": "[TAP/TAP] 绕过局域网",
"Bypass LAN and China": "[网页代理] 绕过局域网和中国大陆",
"Bypass LAN and China (Non System Proxy)": "[网页代理] 绕过局域网和中国大陆 (不设置系统代理)",
"Bypass LAN and China (TUN/TAP)": "[TUN/TAP] 绕过局域网和中国大陆"
}

View File

@@ -9,7 +9,7 @@ Game accelerator
- [Netch](#netch)
- [TOC](#toc)
- [Description](#description)
- [Sponsor](#sponsor)
- [Donate](#donate)
- [Screenshots](#screenshots)
- [Requirements](#requirements)
@@ -19,40 +19,25 @@ Netch is an open source game accelerator. Unlike SSTap, which needs to add rules
As well, Netch avoid the restricted NAT problem caused by SSTap. You can use an NATTypeTester to test out what your NAT type is. When using SSTap to speed up some P2P gaming connections or the game is required for that kind of open NAT type, you may experience some bad situations such as unable to join the game.
## Sponsor
开发不易,以下为恰饭时间
[![NyanCAT](docs/sponsor/nyancat.jpg)](https://nyancat.info)
NyanCAT Network全中转高质量节点多条低倍率节点保证流量无忧节点极低延迟涵盖五大洲。Netflix 视频党,游戏党,海外回国党必备,无需年付,月付 19 元起。[测速图](https://t.me/BGP2020/935)
[加入 Telegram 群组](https://t.me/NyanCaaaat)
[![ManSora](docs/sponsor/mansora.jpg)](https://www.mansora.net/cart.php)
## Donate
- XMR *48ju3ELNZEa6wwPBMexCJ9G218BGY2XwhH6B6bmkFuJ3QgM4hPw2Pra35jPtuBZSc7SLNWeBpiWJZWjQeMAiLnTx2tH2Efx*
## Screenshots
![](docs/screenshots/main.png)
## Requirements
- Microsoft Visual C++ Runtime
- [.NET Framework 4.8](https://dotnet.microsoft.com/download/dotnet-framework/net48)
## Quote
https://github.com/eycorsican/go-tun2socks
https://github.com/shadowsocks/shadowsocks-libev
https://github.com/shadowsocksrr/shadowsocksr-libev
https://github.com/v2ray/v2ray-core
https://github.com/ACL4SSR/ACL4SSR
https://github.com/felixonmars/dnsmasq-china-list
https://github.com/NLnetLabs/unbound
https://github.com/OpenVPN/tap-windows6
https://sourceforge.net/projects/ijbswa/
- [go-tun2socks](https://github.com/eycorsican/go-tun2socks)
- [shadowsocks-libev](https://github.com/shadowsocks/shadowsocks-libev)
- [shadowsocksr-libev](https://github.com/shadowsocksrr/shadowsocksr-libev)
- [v2ray-core](https://github.com/v2ray/v2ray-core)
- [ACL4SSR](https://github.com/ACL4SSR/ACL4SSR)
- [dnsmasq-china-list](https://github.com/felixonmars/dnsmasq-china-list)
- [unbound](https://github.com/NLnetLabs/unbound)
- [tap-windows6](https://github.com/OpenVPN/tap-windows6)
- [Privoxy](https://www.privoxy.org/)
- [NatTypeTester](https://github.com/HMBSbige/NatTypeTester)
- [NetFilter SDK](https://netfiltersdk.com/)

View File

@@ -22,52 +22,20 @@ function Build-NetFrameworkx64
Write-Host 'Build x64 Complete ,Started Copy bin,mode,i18n file'
mkdir "$net_baseoutput\x64\Release\win-x64\bin"
Copy-Item "$mainDir\binaries\x64\*" -destination "$net_baseoutput\x64\Release\win-x64\bin" -recurse
mkdir "$net_baseoutput\x64\Release\win-x64\bin\tap-driver"
Copy-Item "$mainDir\binaries\tap-driver\*" -destination "$net_baseoutput\x64\Release\win-x64\bin\tap-driver" -recurse
Copy-Item "$mainDir\binaries\*.acl" "$net_baseoutput\x64\Release\win-x64\bin"
Copy-Item "$mainDir\binaries\*.conf" "$net_baseoutput\x64\Release\win-x64\bin"
Copy-Item "$mainDir\binaries\*.dat" "$net_baseoutput\x64\Release\win-x64\bin"
Copy-Item "$mainDir\binaries\*.exe" "$net_baseoutput\x64\Release\win-x64\bin"
Move-Item "$net_baseoutput\x64\Release\win-x64\bin\nfapinet.dll" "$net_baseoutput\x64\Release\win-x64\nfapinet.dll"
Copy-Item "$mainDir\translations\i18n" "$net_baseoutput\x64\Release\win-x64\i18n" -recurse
mkdir "$net_baseoutput\x64\Release\win-x64\mode"
Copy-Item "$mainDir\modes\mode\*.txt" "$net_baseoutput\x64\Release\win-x64\mode"
Copy-Item "$mainDir\translations\i18n\*" "$net_baseoutput\x64\Release\win-x64\i18n" -recurse
Write-Host 'x64 ALL DONE'
Copy-Item "$mainDir\modes\mode\*" "$net_baseoutput\x64\Release\win-x64\mode" -recurse
}
function Build-NetFrameworkx86
{
Write-Host 'Building .NET Framework x86'
$outdir = "$net_baseoutput\x86"
msbuild -v:m -m -t:Build /p:Configuration="Release" /p:Platform="x86" /p:TargetFramework=net48 /p:Runtimeidentifier=win-x86 /restore
if ($LASTEXITCODE) { cd $mainDir ; exit $LASTEXITCODE }
Remove-Item -path "$net_baseoutput\x64\Release\win-x64\bin\tap-driver"
Write-Host 'Build x86 Complete ,Started Copy bin,mode,i18n file'
mkdir "$net_baseoutput\x86\Release\win-x86\bin"
Copy-Item "$mainDir\binaries\x86\*" "$net_baseoutput\x86\Release\win-x86\bin"
mkdir "$net_baseoutput\x86\Release\win-x86\bin\tap-driver"
Copy-Item "$mainDir\binaries\tap-driver\*" "$net_baseoutput\x86\Release\win-x86\bin\tap-driver" -recurse
Copy-Item "$mainDir\binaries\*.acl" "$net_baseoutput\x86\Release\win-x86\bin"
Copy-Item "$mainDir\binaries\*.conf" "$net_baseoutput\x86\Release\win-x86\bin"
Copy-Item "$mainDir\binaries\*.dat" "$net_baseoutput\x86\Release\win-x86\bin"
Copy-Item "$mainDir\binaries\*.exe" "$net_baseoutput\x86\Release\win-x86\bin"
Move-Item "$net_baseoutput\x86\Release\win-x86\bin\nfapinet.dll" "$net_baseoutput\x86\Release\win-x86\nfapinet.dll"
Copy-Item "$mainDir\translations\i18n" "$net_baseoutput\x86\Release\win-x86\i18n" -recurse
mkdir "$net_baseoutput\x86\Release\win-x86\mode"
Copy-Item "$mainDir\modes\mode\*.txt" "$net_baseoutput\x86\Release\win-x86\mode"
Copy-Item "$mainDir\binaries\*" -destination "$net_baseoutput\x64\Release\win-x64\bin" -recurse
Write-Host 'Netch Build ALL DONE'
Write-Host 'x86 ALL DONE'
}
cd $mainDir\Netch
Build-NetFrameworkx64
Build-NetFrameworkx86
cd $mainDir

View File

@@ -25,18 +25,18 @@
## 选择模式
> 此处需要会一点英语,比如你应该知道`吃鸡`的英文名称是`PlayerUnknown's Battlegrounds`
> 此处需要会一点英语,比如你应该知道 `吃鸡` 的英文名称是 `PlayerUnknown's Battlegrounds`
1.3.7 上线了模式搜索功能,即在模式框里输入字符即可搜索,使用英文名称进行搜索,搜索到所需的模式后单击选择,启用模式。相对应的游戏即可被加速
若没有所需的模式,请选择`[3] Bypass LAN and China (TUN/TAP)`的模式。此模式需要安装 [Tap-Windows](https://github.com/OpenVPN/tap-windows) 适配器,如果 Netch 提示没有该适配器,可以直接安装 [Tap-Windows](https://build.openvpn.net/downloads/releases/latest/tap-windows-latest-stable.exe) 来获得该适配器
若没有所需的模式,请选择 `[3] Bypass LAN and China (TUN/TAP)` 的模式。此模式需要安装 [TAP-Windows](https://github.com/OpenVPN/tap-windows) 适配器,如果 Netch 提示没有该适配器,可以直接安装 [TAP-Windows](https://build.openvpn.net/downloads/releases/latest/tap-windows-latest-stable.exe) 来获得该适配器
关于更多的模式说明,详见[进阶用法](https://github.com/NormanBB/NetchMode/blob/master/docs/README.zh-CN.md)。
关于更多的模式说明,详见 [进阶用法](https://github.com/NormanBB/NetchMode/blob/master/docs/README.zh-CN.md)。
选择完模式后,点击启用,游戏已被代理。这一步需在开启游戏前完成。
## 配置说明
目前,netch支持自定义四个配置填入配置名选择相应的服务器和游戏模式按下`Ctrl`与鼠标左键,即可保存当前配置。下次使用时,点击配置名即可快速启用。
目前,Netch 支持自定义四个配置,填入配置名,选择相应的服务器和游戏模式,按下 `Ctrl` 与鼠标左键,即可保存当前配置。下次使用时,点击配置名即可快速启用。
~~如果你还觉得不会用可以去用SStap (逃~~
~~ 如果你还觉得不会用,可以去用 SSTap (逃~~

View File

@@ -1,37 +1,27 @@
# Netch
[![](https://img.shields.io/badge/Telegram-频道-blue.svg)](https://t.me/Netch)
> ~~issue已关有问题可进tele群问不保证回答不保证解决咕~~
[![](https://img.shields.io/badge/Telegram-频道-blue)](https://t.me/Netch) [![](https://img.shields.io/badge/Telegram-讨论组-green)](https://t.me/Netch_Discuss_Group) ![GitHub Actions & Netch CI](https://github.com/NetchX/Netch/workflows/GitHub%20Actions%20&%20Netch%20CI/badge.svg)
游戏加速工具
## TOC
- [Netch](#netch)
- [TOC](#toc)
- [简介](#%e7%ae%80%e4%bb%8b)
- [赞助商](#%e8%b5%9e%e5%8a%a9%e5%95%86)
- [Netch](#Netch)
- [TOC](#TOC)
- [简介](#简介)
- [捐赠](#捐赠)
- [新手入门](Basic-usage.md)
- [进阶用法](https://github.com/NormanBB/NetchMode/blob/master/docs/README.zh-CN.md)
- [依赖](#%e4%be%9d%e8%b5%96)
- [依赖](#依赖)
- [语言支持](#语言支持)
## 简介
Netch 是一款 Windows 平台的开源游戏加速工具Netch 可以实现类似 SocksCap64 那样的进程代理,也可以实现 SSTap 那样的全局 TUN/TAP 代理,和 Shadowsocks-Windows 那样的本地 Socks5HTTP 和系统代理。至于连接至远程服务器的代理协议,目前 Netch 支持以下代理协议ShadowsocksVMessSocks5ShadowsocksR
与此同时 Netch 避免了 SSTap 的 NAT 问题 ,检查 NAT 类型即可知道是否有 NAT 问题。使用 SSTap 加速部分 P2P 联机,对 NAT 类型有要求的游戏时,可能会因为 NAT 类型严格遇到无法加入联机,或者其他影响游戏体验的情况
## 赞助商
开发不易,以下为恰饭时间
[![NyanCAT](sponsor/nyancat.jpg)](https://nyancat.info)
NyanCAT Network全中转高质量节点多条低倍率节点保证流量无忧节点极低延迟涵盖五大洲。Netflix 视频党,游戏党,海外回国党必备,无需年付,月付 19 元起。[测速图](https://t.me/BGP2020/935)
[加入 Telegram 群组](https://t.me/NyanCaaaat)
[![ManSora](sponsor/mansora.jpg)](https://www.mansora.net/cart.php)
## 捐赠
- XMR *48ju3ELNZEa6wwPBMexCJ9G218BGY2XwhH6B6bmkFuJ3QgM4hPw2Pra35jPtuBZSc7SLNWeBpiWJZWjQeMAiLnTx2tH2Efx*
## 新手入门
[新手入门教程](Basic-usage.md)
## 进阶用法
@@ -42,24 +32,17 @@ NyanCAT Network全中转高质量节点多条低倍率节点保证流量
- [TAP-Windows](https://build.openvpn.net/downloads/releases/tap-windows-9.21.2.exe)
## 语言支持
Netch 支持多种语言,在启动时会根据系统语言选择自身语言。如果需要手动切换语言,可以在启动时加入命令行参数,命令行参数为目前支持的语言代码,可以去 [NetchTranslation/i18n](https://github.com/NetchX/NetchTranslation/tree/master/i18n) 文件夹下查看外部支持的语言代码文件。Netch 目前内置 en-USzh-CN外置 zh-TW。欢迎大家为 [NetchTranslation](https://github.com/NetchX/NetchTranslation) 提供其他语言的翻译
## 引用
https://github.com/eycorsican/go-tun2socks
https://github.com/shadowsocks/shadowsocks-libev
https://github.com/shadowsocksrr/shadowsocksr-libev
https://github.com/v2ray/v2ray-core
https://github.com/ACL4SSR/ACL4SSR
https://github.com/felixonmars/dnsmasq-china-list
https://github.com/NLnetLabs/unbound
https://github.com/OpenVPN/tap-windows6
https://sourceforge.net/projects/ijbswa/
- [go-tun2socks](https://github.com/eycorsican/go-tun2socks)
- [shadowsocks-libev](https://github.com/shadowsocks/shadowsocks-libev)
- [shadowsocksr-libev](https://github.com/shadowsocksrr/shadowsocksr-libev)
- [v2ray-core](https://github.com/v2ray/v2ray-core)
- [ACL4SSR](https://github.com/ACL4SSR/ACL4SSR)
- [dnsmasq-china-list](https://github.com/felixonmars/dnsmasq-china-list)
- [unbound](https://github.com/NLnetLabs/unbound)
- [tap-windows6](https://github.com/OpenVPN/tap-windows6)
- [Privoxy](https://www.privoxy.org/)
- [NatTypeTester](https://github.com/HMBSbige/NatTypeTester)
- [NetFilter SDK](https://netfiltersdk.com/)

2
modes

Submodule modes updated: a9329cd3f1...314f2d14b4