简化代码

This commit is contained in:
SpringHgui 2021-06-19 14:26:57 +08:00
parent 6eb52341a7
commit 98eb26bd6d
31 changed files with 102 additions and 486 deletions

View File

@ -8,7 +8,7 @@ using System.Threading.Tasks;
namespace FastTunnel.Core
{
public class AsyncSocketSwapV2
public class AsyncSocketSwap
{
private Socket m_sockt1;
private Socket m_sockt2;
@ -18,7 +18,7 @@ namespace FastTunnel.Core
SocketAsyncEventArgs e1;
SocketAsyncEventArgs e2;
public AsyncSocketSwapV2(Socket sockt1, Socket sockt2)
public AsyncSocketSwap(Socket sockt1, Socket sockt2)
{
m_sockt1 = sockt1;
m_sockt2 = sockt2;
@ -35,7 +35,7 @@ namespace FastTunnel.Core
e2.SetBuffer(m_buffer, 512, 512);
}
public AsyncSocketSwapV2 BeforeSwap(Action fun)
public AsyncSocketSwap BeforeSwap(Action fun)
{
if (m_swaping)
throw new Exception("BeforeSwap must be invoked before StartSwap!");

View File

@ -24,7 +24,6 @@ namespace FastTunnel.Core.Client
protected ILogger<FastTunnelClient> _logger;
System.Timers.Timer timer_timeout;
System.Timers.Timer timer_heart;
double heartInterval = 10 * 1000; // 10 秒心跳
@ -54,65 +53,33 @@ namespace FastTunnel.Core.Client
_logHandler = logHandler;
_clientHeartHandler = clientHeartHandler;
_configuration = configuration;
initailTimer();
}
private void initailTimer()
{
timer_heart = new System.Timers.Timer();
timer_heart.AutoReset = false;
timer_heart.Interval = heartInterval;
timer_heart.Elapsed += HeartElapsed;
timer_timeout = new System.Timers.Timer();
timer_timeout.AutoReset = false;
timer_timeout.Interval = heartInterval + heartInterval / 2;
timer_timeout.Elapsed += TimeoutElapsed;
}
private void TimeoutElapsed(object sender, ElapsedEventArgs e)
{
timer_timeout.Enabled = false;
try
{
var timer = sender as System.Timers.Timer;
var span = (DateTime.Now - lastHeart).TotalMilliseconds;
if (span > timer.Interval)
{
_logger.LogDebug($"last heart recived {span / 1000}s ago");
// 重新登录
reConnectAsync().Wait();
}
}
catch (Exception ex)
{
_logger.LogError(ex);
}
finally
{
timer_timeout.Enabled = true;
}
}
private async Task reConnectAsync()
private void reConn()
{
Close();
try
while (true)
{
_logger.LogInformation("登录重试...");
_client = lastLogin.Invoke();
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
try
{
_logger.LogInformation("登录重试...");
_client = lastLogin.Invoke();
Thread.Sleep(reTrySpan);
await reConnectAsync();
break;
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
Thread.Sleep(reTrySpan);
}
}
LogSuccess(_client);
connSuccessAsync();
}
private void HeartElapsed(object sender, ElapsedEventArgs e)
@ -121,11 +88,12 @@ namespace FastTunnel.Core.Client
try
{
_client.Send(new Message<HeartMassage> { MessageType = MessageType.Heart, Content = null });
_client.SendCmd(new Message<HeartMassage> { MessageType = MessageType.Heart, Content = null });
}
catch (Exception ex)
catch (Exception)
{
_logger.LogError(ex.Message);
// 与服务端断开连接
reConn();
}
finally
{
@ -153,11 +121,11 @@ namespace FastTunnel.Core.Client
_logger.LogError(ex.Message);
Thread.Sleep(reTrySpan);
reConnectAsync().Wait();
reConn();
return;
}
LogSuccess(_client);
_ = connSuccessAsync();
}
protected virtual Socket login()
@ -201,60 +169,44 @@ namespace FastTunnel.Core.Client
void Close()
{
timer_heart.Stop();
timer_timeout.Stop();
try
{
if (_client != null && _client.Connected)
{
_client.Shutdown(SocketShutdown.Both);
}
_client.Shutdown(SocketShutdown.Both);
}
catch (Exception)
{
}
_client.Close();
}
private async Task connSuccessAsync()
{
_logger.LogDebug("通信已建立");
// 心跳开始
timer_heart.Start();
await new PipeHepler(_client, ProceccLine).ProcessLinesAsync();
}
private bool ProceccLine(Socket socket, byte[] line)
{
try
{
var cmd = Encoding.UTF8.GetString(line);
HandleServerRequest(cmd);
}
catch (Exception ex)
{
_logger.LogError(ex);
}
finally
{
if (_client != null)
{
_client.Close();
}
_logger.LogDebug("已退出登录\n");
}
}
private void LogSuccess(Socket socket)
{
_logger.LogDebug("通信已建立");
lastHeart = DateTime.Now;
// 心跳开始
timer_heart.Start();
timer_timeout.Start();
//th = new Thread(ReceiveServer);
//th.Start(socket);
ReceiveServerV2(socket);
}
private void ReceiveServerV2(object obj)
{
var client = obj as Socket;
new PipeHepler(client, ProceccLine).ProcessLinesAsync();
}
private bool ProceccLine(Socket socket, byte[] line)
{
var cmd = Encoding.UTF8.GetString(line);
HandleServerRequest(cmd);
return true;
}
private IClientHandler HandleServerRequest(string words)
private void HandleServerRequest(string words)
{
var Msg = JsonConvert.DeserializeObject<Message<JObject>>(words);
IClientHandler handler;
@ -277,7 +229,6 @@ namespace FastTunnel.Core.Client
}
handler.HandlerMsg(this, Msg);
return handler;
}
}
}

View File

@ -18,15 +18,19 @@ namespace FastTunnel.Core.Client
/// 外部请求,需要定期清理
/// TODO:是否可以实现LRU
/// </summary>
public ConcurrentDictionary<string, NewRequest> RequestTemp = new ConcurrentDictionary<string, NewRequest>();
public ConcurrentDictionary<string, NewRequest> RequestTemp { get; private set; }
= new ConcurrentDictionary<string, NewRequest>();
public ConcurrentDictionary<string, WebInfo> WebList = new ConcurrentDictionary<string, WebInfo>();
public ConcurrentDictionary<int, SSHInfo<SSHHandlerArg>> SSHList = new ConcurrentDictionary<int, SSHInfo<SSHHandlerArg>>();
public ConcurrentDictionary<string, WebInfo> WebList { get; private set; }
= new ConcurrentDictionary<string, WebInfo>();
public ConcurrentDictionary<int, SSHInfo<SSHHandlerArg>> SSHList { get; private set; }
= new ConcurrentDictionary<int, SSHInfo<SSHHandlerArg>>();
public readonly IServerConfig ServerSettings;
readonly ILogger _logger;
ClientListenerV2 clientListener;
HttpListenerV2 http_listener;
readonly ClientListenerV2 clientListener;
readonly HttpListenerV2 http_listener;
public FastTunnelServer(ILogger<FastTunnelServer> logger, IConfiguration configuration)
{
@ -35,8 +39,6 @@ namespace FastTunnel.Core.Client
clientListener = new ClientListenerV2(this, ServerSettings.BindAddr, ServerSettings.BindPort, _logger);
http_listener = new HttpListenerV2(ServerSettings.BindAddr, ServerSettings.WebProxyPort, _logger);
clientListener.OnClientsChange += Client_listener_OnClientsChange;
}
public void Run()
@ -67,19 +69,12 @@ namespace FastTunnel.Core.Client
http_listener.Start(new HttpDispatcherV2(this, _logger, ServerSettings));
}
private void Client_listener_OnClientsChange(System.Net.Sockets.Socket socket, int count, bool is_oofline)
{
if (is_oofline)
_logger.LogDebug($"客户端 {socket.RemoteEndPoint} 已断开,当前连接数:{count}");
else
_logger.LogDebug($"客户端 {socket.RemoteEndPoint} 已连接,当前连接数:{count}");
}
public void Stop(CancellationToken cancellationToken)
public void Stop()
{
_logger.LogInformation("===== FastTunnel Server Stoping =====");
// TODO:释放资源和线程
clientListener.Stop();
http_listener.Stop();
}
}
}

View File

@ -1,62 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace FastTunnel.Core.Config
{
public class DefaultServerConfigBuilder
{
readonly DefaultServerConfig _options = new DefaultServerConfig();
public DefaultServerConfigBuilder WithBindInfo(string host, int port)
{
_options.BindAddr = host;
_options.BindPort = port;
return this;
}
public DefaultServerConfigBuilder WithWebDomain(string domain)
{
_options.WebDomain = domain;
return this;
}
public DefaultServerConfigBuilder WithSSHEnabled(bool enbaled)
{
_options.SSHEnabled = enbaled;
return this;
}
public DefaultServerConfigBuilder WithHasNginxProxy(bool has)
{
_options.WebHasNginxProxy = has;
return this;
}
public DefaultServerConfigBuilder WithWebAllowAccessIps(string[] ips)
{
_options.WebAllowAccessIps = ips;
return this;
}
public DefaultServerConfigBuilder WithHTTPPort(int port)
{
_options.WebProxyPort = port;
return this;
}
public DefaultServerConfig Build()
{
if (string.IsNullOrEmpty(_options.BindAddr))
throw new ArgumentNullException("You must use WithBindInfo to set host");
if (_options.BindPort == 0)
throw new ArgumentNullException("You must use WithBindInfo to set port");
if (string.IsNullOrEmpty(_options.WebDomain))
throw new ArgumentNullException("You must use WithWebDomain to set domain");
return _options;
}
}
}

View File

@ -1,12 +1,11 @@
using FastTunnel.Core.Config;
using FastTunnel.Core.Models;
using FastTunnel.Core.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FastTunnel.Core.Client
namespace FastTunnel.Core.Config
{
public interface IClientConfig
{

View File

@ -47,7 +47,7 @@ namespace FastTunnel.Core
public void Send<T>(Message<T> msg)
where T : TunnelMassage
{
Socket.Send(msg);
Socket.SendCmd(msg);
}
public void Close()

View File

@ -32,7 +32,7 @@ namespace FastTunnel.Core.Dispatchers
public void Dispatch(AsyncUserToken token, string words)
{
Console.WriteLine("=======Dispatch HTTP========");
_logger.LogDebug("=======Dispatch HTTP========");
// 1.检查白名单
try
@ -54,7 +54,7 @@ namespace FastTunnel.Core.Dispatchers
_logger.LogError(ex);
}
Console.WriteLine("=======Dispatch Matches========");
_logger.LogDebug("=======Dispatch Matches========");
string Host;
MatchCollection collection = Regex.Matches(words, pattern);
@ -74,7 +74,7 @@ namespace FastTunnel.Core.Dispatchers
_logger.LogDebug(Host.Replace("\r", ""));
var domain = Host.Split(":")[1].Trim();
Console.WriteLine($"=======Dispatch domain:{domain}========");
_logger.LogDebug($"=======Dispatch domain:{domain}========");
// 判断是否为ip
if (IsIpDomian(domain))
@ -87,12 +87,12 @@ namespace FastTunnel.Core.Dispatchers
WebInfo web;
if (!_fastTunnelServer.WebList.TryGetValue(domain, out web))
{
Console.WriteLine($"=======Dispatch 未登录========");
_logger.LogDebug($"=======Dispatch 未登录========");
HandlerClientNotOnLine(token.Socket, domain);
return;
}
Console.WriteLine($"=======Dispatch 已找到========");
_logger.LogDebug($"=======Dispatch 已找到========");
var msgid = Guid.NewGuid().ToString();
_fastTunnelServer.RequestTemp.TryAdd(msgid, new NewRequest
{
@ -100,20 +100,20 @@ namespace FastTunnel.Core.Dispatchers
Buffer = token.Recived
});
Console.WriteLine($"=======Dispatch 发送msg========");
_logger.LogDebug($"=======Dispatch 发送msg========");
try
{
_logger.LogDebug($"=======OK========");
web.Socket.Send(new Message<NewCustomerMassage> { MessageType = MessageType.S_NewCustomer, Content = new NewCustomerMassage { MsgId = msgid, WebConfig = web.WebConfig } });
web.Socket.SendCmd(new Message<NewCustomerMassage> { MessageType = MessageType.S_NewCustomer, Content = new NewCustomerMassage { MsgId = msgid, WebConfig = web.WebConfig } });
Console.WriteLine($"=======Dispatch OK========");
_logger.LogDebug($"=======Dispatch OK========");
}
catch (Exception)
{
HandlerClientNotOnLine(token.Socket, domain);
Console.WriteLine($"=======Dispatch 移除========");
_logger.LogDebug($"=======Dispatch 移除========");
// 移除
_fastTunnelServer.WebList.TryRemove(domain, out _);

View File

@ -8,8 +8,6 @@ namespace FastTunnel.Core.Dispatchers
{
public interface IListenerDispatcher
{
void Dispatch(Socket httpClient, Action<Socket> onOffLine);
void Dispatch(AsyncUserToken token, string words);
void Dispatch(Socket httpClient);

View File

@ -8,7 +8,7 @@ using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
namespace FastTunnel.Core.Handlers.Server
namespace FastTunnel.Core.Dispatchers
{
public class SSHDispatcher : IListenerDispatcher
{
@ -26,18 +26,13 @@ namespace FastTunnel.Core.Handlers.Server
public void Dispatch(Socket _socket)
{
var msgid = Guid.NewGuid().ToString();
_client.Send(new Message<NewSSHRequest> { MessageType = MessageType.S_NewSSH, Content = new NewSSHRequest { MsgId = msgid, SSHConfig = _config } });
_client.SendCmd(new Message<NewSSHRequest> { MessageType = MessageType.S_NewSSH, Content = new NewSSHRequest { MsgId = msgid, SSHConfig = _config } });
_server.RequestTemp.TryAdd(msgid, new NewRequest
{
CustomerClient = _socket,
});
}
public void Dispatch(Socket httpClient, Action<Socket> onOffLine)
{
Dispatch(httpClient);
}
public void Dispatch(AsyncUserToken token, string words)
{
throw new NotImplementedException();

View File

@ -22,10 +22,10 @@
</PropertyGroup>
<ItemGroup>
<Compile Remove="AsyncSocketSwap.cs" />
<Compile Remove="Client\SuiDaoServer.cs.BASE.cs" />
<Compile Remove="Client\SuiDaoServer.cs.LOCAL.cs" />
<Compile Remove="Client\SuiDaoServer.cs.REMOTE.cs" />
<Compile Remove="Dispatchers\ClientDispatcher.cs" />
<Compile Remove="Dispatchers\HttpDispatcher.cs" />
<Compile Remove="Listener.cs" />
<Compile Remove="Listener\ClientListener.cs" />

View File

@ -26,13 +26,13 @@ namespace FastTunnel.Core.Handlers.Client
switch (msg.MsgType)
{
case LogMsgType.Info:
_logger.LogInformation("From Server:" + msg.Msg);
_logger.LogInformation($"[Server Info]:{msg.Msg}");
break;
case LogMsgType.Error:
_logger.LogError("From Server:" + msg.Msg);
_logger.LogError($"[Server Error]:{msg.Msg}");
break;
case LogMsgType.Debug:
_logger.LogDebug("From Server:" + msg.Msg);
_logger.LogDebug($"[Server Debug]:{msg.Msg}");
break;
default:
break;

View File

@ -15,7 +15,7 @@ namespace FastTunnel.Core.Handlers.Server
public void HandlerMsg(FastTunnelServer server, Socket client, Message<JObject> msg)
{
client.Send(new Message<HeartMassage>() { MessageType = MessageType.Heart, Content = null });
client.SendCmd(new Message<HeartMassage>() { MessageType = MessageType.Heart, Content = null });
}
}
}

View File

@ -1,4 +1,5 @@
using FastTunnel.Core.Client;
using FastTunnel.Core.Dispatchers;
using FastTunnel.Core.Extensions;
using FastTunnel.Core.Filters;
using FastTunnel.Core.Global;
@ -56,7 +57,7 @@ namespace FastTunnel.Core.Handlers
var result = item.Authentication(server, requet);
if (!result)
{
client.Send(new Message<LogMassage>
client.SendCmd(new Message<LogMassage>
{
MessageType = MessageType.Log,
Content = new LogMassage(LogMsgType.Error, "认证失败")
@ -140,7 +141,7 @@ namespace FastTunnel.Core.Handlers
{
_logger.LogError($"SSH proxy error: {item.RemotePort} => {item.LocalIp}:{item.LocalPort}");
_logger.LogError(ex.Message);
client.Send(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, ex.Message) });
client.SendCmd(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, ex.Message) });
continue;
}
}
@ -148,12 +149,12 @@ namespace FastTunnel.Core.Handlers
if (!hasTunnel)
{
client.Send(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, TunnelResource.NoTunnel) });
client.SendCmd(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, TunnelResource.NoTunnel) });
}
else
{
sb.Append($"{Environment.NewLine}====================================================");
client.Send(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, sb.ToString()) });
client.SendCmd(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, sb.ToString()) });
}
}
}

View File

@ -29,22 +29,22 @@ namespace FastTunnel.Core.Handlers.Server
if (!string.IsNullOrEmpty(SwapMsg.msgId) && server.RequestTemp.TryGetValue(SwapMsg.msgId, out request))
{
server.RequestTemp.TryRemove(SwapMsg.msgId, out _);
// Join
// Swap
new SocketSwap(request.CustomerClient, client)
.BeforeSwap(() =>
{
if (request.Buffer != null) client.Send(request.Buffer);
})
.StartSwapAsync();
server.RequestTemp.TryRemove(SwapMsg.msgId, out _);
}
else
{
// 未找到,关闭连接
_logger.LogError($"未找到请求:{SwapMsg.msgId}");
client.Send(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Debug, $"未找到请求:{SwapMsg.msgId}") });
client.SendCmd(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Debug, $"未找到请求:{SwapMsg.msgId}") });
try
{
@ -53,10 +53,8 @@ namespace FastTunnel.Core.Handlers.Server
catch (Exception)
{
}
finally
{
client.Close();
}
client.Close();
}
}
}

View File

@ -1,133 +0,0 @@
using FastTunnel.Core.Client;
using FastTunnel.Core.Extensions;
using FastTunnel.Core.Handlers;
using FastTunnel.Core.Handlers.Server;
using FastTunnel.Core.Models;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Net.Sockets;
using System.Text;
namespace FastTunnel.Core.Listener
{
public class ClientConnection
{
public Socket Socket { get; }
readonly ILogger _logger;
readonly LoginHandler _loginHandler;
readonly HeartMessageHandler _heartHandler;
readonly SwapMessageHandler _swapMsgHandler;
readonly FastTunnelServer _fastTunnelServer;
readonly DataReciver reader;
public ClientConnection(FastTunnelServer fastTunnelServer, Socket accept, ILogger logerr)
{
Socket = accept;
_logger = logerr;
_fastTunnelServer = fastTunnelServer;
_loginHandler = new LoginHandler(_logger);
_heartHandler = new HeartMessageHandler();
_swapMsgHandler = new SwapMessageHandler(_logger);
reader = new DataReciver(Socket);
}
public void StartRecive()
{
reader.OnComplete += Reader_OnComplete;
reader.OnError += Reader_OnError;
reader.OnReset += Reader_OnReset;
reader.ReciveOneAsync();
}
private void Reader_OnReset(DataReciver send, Socket socket, SocketAsyncEventArgs e)
{
//offLineAction(socket);
}
private void Reader_OnError(DataReciver send, SocketAsyncEventArgs e)
{
_logger.LogError("接收客户端数据异常 {0}", e.SocketError);
}
string temp = string.Empty;
private void Reader_OnComplete(DataReciver reader, byte[] buffer, int offset, int count)
{
var words = Encoding.UTF8.GetString(buffer, offset, count);
words += temp;
temp = string.Empty;
_logger.LogDebug($"revice from client: {words}");
try
{
int index = 0;
bool needRecive = false;
while (true)
{
var firstIndex = words.IndexOf("\n");
if (firstIndex < 0)
{
temp += words;
reader.ReciveOneAsync();
break;
}
var sub_words = words.Substring(index, firstIndex + 1);
var res = handle(sub_words, reader.Socket);
if (res.NeedRecive)
needRecive = true;
words = words.Replace(sub_words, string.Empty);
if (string.IsNullOrEmpty(words))
break;
}
if (needRecive)
{
reader.ReciveOneAsync();
}
}
catch (Exception ex)
{
_logger.LogError(ex.ToString());
_logger.LogError($"handle fail msg{words}");
// throw;
reader.Socket.Send(new Message<LogMassage>() { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Error, ex.Message) });
reader.ReciveOneAsync();
}
}
private IClientMessageHandler handle(string words, Socket client)
{
Message<JObject> msg = JsonConvert.DeserializeObject<Message<JObject>>(words);
IClientMessageHandler handler = null;
switch (msg.MessageType)
{
case MessageType.C_LogIn: // 登录
handler = _loginHandler;
break;
case MessageType.Heart: // 心跳
handler = _heartHandler;
break;
case MessageType.C_SwapMsg: // 交换数据
handler = _swapMsgHandler;
break;
default:
throw new Exception($"未知的通讯指令 {msg.MessageType}");
}
handler.HandlerMsg(this._fastTunnelServer, client, msg);
return handler;
}
}
}

View File

@ -16,7 +16,7 @@ using System.Threading;
namespace FastTunnel.Core.Listener
{
public class ClientListenerV2 : IListener
public class ClientListenerV2
{
ILogger _logger;
@ -24,9 +24,6 @@ namespace FastTunnel.Core.Listener
public int ListenPort { get; set; }
public event OnClientChangeLine OnClientsChange;
public IList<ClientConnection> ConnectedSockets = new List<ClientConnection>();
FastTunnelServer _fastTunnelServer;
Server.Server server;
@ -60,8 +57,6 @@ namespace FastTunnel.Core.Listener
private bool handle(AsyncUserToken token, string words)
{
//Console.WriteLine($"[Client请求] {words}");
Message<JObject> msg = JsonConvert.DeserializeObject<Message<JObject>>(words);
IClientMessageHandler handler = null;

View File

@ -15,17 +15,11 @@ namespace FastTunnel.Core.Listener
{
ILogger _logger;
public string ListenIp { get; set; }
public string ListenIp { get; protected set; }
public int ListenPort { get; set; }
public int ListenPort { get; protected set; }
int m_numConnectedSockets;
public event OnClientChangeLine OnClientsChange;
bool shutdown = false;
IListenerDispatcher _requestDispatcher;
Socket listenSocket;
public IList<Socket> ConnectedSockets = new List<Socket>();
Server.Server server;
@ -39,95 +33,6 @@ namespace FastTunnel.Core.Listener
server = new Server.Server(1000, 512);
}
private void OnOffLine(Socket socket)
{
if (ConnectedSockets.Remove(socket))
OnClientsChange?.Invoke(socket, ConnectedSockets.Count, true);
}
private void OnAccept(Socket socket)
{
ConnectedSockets.Add(socket);
OnClientsChange?.Invoke(socket, ConnectedSockets.Count, false);
}
public void Stop()
{
if (shutdown)
return;
try
{
if (listenSocket.Connected)
{
listenSocket.Shutdown(SocketShutdown.Both);
}
}
catch (Exception)
{
}
finally
{
shutdown = true;
listenSocket.Close();
Interlocked.Decrement(ref m_numConnectedSockets);
}
}
private void StartAccept(SocketAsyncEventArgs acceptEventArg)
{
_logger.LogDebug($"【{ListenIp}:{ListenPort}】: StartAccept");
if (acceptEventArg == null)
{
acceptEventArg = new SocketAsyncEventArgs();
acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(AcceptEventArg_Completed);
}
else
{
// socket must be cleared since the context object is being reused
acceptEventArg.AcceptSocket = null;
}
bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg);
if (!willRaiseEvent)
{
ProcessAccept(acceptEventArg);
}
}
private void ProcessAccept(SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
var accept = e.AcceptSocket;
OnAccept(accept);
Interlocked.Increment(ref m_numConnectedSockets);
_logger.LogInformation($"【{ListenIp}:{ListenPort}】Accepted. There are {{0}} clients connected to the port",
m_numConnectedSockets);
// Accept the next connection request
StartAccept(e);
// 将此客户端交由Dispatcher进行管理
_requestDispatcher.Dispatch(accept, this.OnOffLine);
}
else
{
Stop();
}
}
private void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs e)
{
ProcessAccept(e);
}
public void Close()
{
}
public void Start(IListenerDispatcher requestDispatcher, int backlog = 100)
{
_requestDispatcher = requestDispatcher;
@ -146,5 +51,9 @@ namespace FastTunnel.Core.Listener
_requestDispatcher.Dispatch(token, words);
return false;
}
public void Stop()
{
}
}
}

View File

@ -21,6 +21,5 @@ namespace FastTunnel.Core.Listener
void Close();
event OnClientChangeLine OnClientsChange;
}
}

View File

@ -19,8 +19,6 @@ namespace FastTunnel.Core.Listener
int m_numConnectedSockets;
public event OnClientChangeLine OnClientsChange;
bool shutdown = false;
IListenerDispatcher _requestDispatcher;
Socket listenSocket;
@ -39,18 +37,6 @@ namespace FastTunnel.Core.Listener
listenSocket.Bind(localEndPoint);
}
private void OnOffLine(Socket socket)
{
if (ConnectedSockets.Remove(socket))
OnClientsChange?.Invoke(socket, ConnectedSockets.Count, true);
}
private void OnAccept(Socket socket)
{
ConnectedSockets.Add(socket);
OnClientsChange?.Invoke(socket, ConnectedSockets.Count, false);
}
public void Start(IListenerDispatcher requestDispatcher, int backlog = 100)
{
shutdown = false;
@ -110,7 +96,6 @@ namespace FastTunnel.Core.Listener
if (e.SocketError == SocketError.Success)
{
var accept = e.AcceptSocket;
OnAccept(accept);
Interlocked.Increment(ref m_numConnectedSockets);
@ -121,7 +106,7 @@ namespace FastTunnel.Core.Listener
StartAccept(e);
// 将此客户端交由Dispatcher进行管理
_requestDispatcher.Dispatch(accept, this.OnOffLine);
_requestDispatcher.Dispatch(accept);
}
else
{

View File

@ -1,13 +0,0 @@
using FastTunnel.Core.Client;
using System;
using System.Collections.Generic;
using System.Text;
namespace FastTunnel.Core.Models
{
public class ClientContext
{
public FastTunnelServer CurrentServer { get; internal set; }
public LogInMassage LogInMassage { get; internal set; }
}
}

View File

@ -46,7 +46,7 @@ namespace FastTunnel.Core.Server
// Tell the PipeWriter how much was read from the Socket.
writer.Advance(bytesRead);
}
catch (Exception ex)
catch (Exception)
{
break;
}

View File

@ -28,7 +28,6 @@ namespace FastTunnel.Core.Server
Func<AsyncUserToken, string, bool> m_handller;
string m_sectionFlag;
bool showLog;
// Create an uninitialized server instance.
// To start the server listening for connection requests

View File

@ -88,7 +88,7 @@ namespace FastTunnel.Core.Services
{
return Task.Run(() =>
{
_server.Stop(cancellationToken);
_server.Stop();
}, cancellationToken);
}
}

View File

@ -8,7 +8,7 @@ namespace FastTunnel.Core.Extensions
{
public static class SocketExtension
{
public static void Send<T>(this Socket socket, Message<T> message)
public static void SendCmd<T>(this Socket socket, Message<T> message)
where T : TunnelMassage
{
socket.Send(Encoding.UTF8.GetBytes(message.ToJson() + "\n"));