mirror of
https://github.com/FastTunnel/FastTunnel.git
synced 2025-02-08 02:39:29 +08:00
修复解析指令时的已知bug
This commit is contained in:
parent
f0b0534902
commit
f7f20cc206
|
@ -30,7 +30,7 @@ namespace FastTunnel.Client
|
|||
{
|
||||
var servicesProvider = new Host().Config(Config).Build();
|
||||
|
||||
Run(servicesProvider);
|
||||
RunAsync(servicesProvider);
|
||||
|
||||
while (true)
|
||||
{
|
||||
|
@ -50,40 +50,40 @@ namespace FastTunnel.Client
|
|||
}
|
||||
}
|
||||
|
||||
private static void Run(IServiceProvider servicesProvider)
|
||||
private static async Task RunAsync(IServiceProvider servicesProvider)
|
||||
{
|
||||
var client = servicesProvider.GetRequiredService<FastTunnelClient>();
|
||||
var config = servicesProvider.GetRequiredService<ClientConfig>();
|
||||
|
||||
client.Login(() =>
|
||||
await client.LoginAsync(Task.Run(() =>
|
||||
{
|
||||
Connecter _client;
|
||||
Connecter _client;
|
||||
|
||||
try
|
||||
{
|
||||
// 连接到的目标IP
|
||||
_client = new Connecter(config.Common.ServerAddr, config.Common.ServerPort);
|
||||
_client.Connect();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Thread.Sleep(5000);
|
||||
throw;
|
||||
}
|
||||
try
|
||||
{
|
||||
// 连接到的目标IP
|
||||
_client = new Connecter(config.Common.ServerAddr, config.Common.ServerPort);
|
||||
_client.Connect();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Thread.Sleep(5000);
|
||||
throw;
|
||||
}
|
||||
|
||||
// 登录
|
||||
_client.Send(new Message<LogInMassage>
|
||||
{
|
||||
MessageType = MessageType.C_LogIn,
|
||||
Content = new LogInMassage
|
||||
{
|
||||
Webs = config.Webs,
|
||||
SSH = config.SSH
|
||||
}
|
||||
});
|
||||
// 登录
|
||||
_client.Send(new Message<LogInMassage>
|
||||
{
|
||||
MessageType = MessageType.C_LogIn,
|
||||
Content = new LogInMassage
|
||||
{
|
||||
Webs = config.Webs,
|
||||
SSH = config.SSH
|
||||
}
|
||||
});
|
||||
|
||||
return _client;
|
||||
}, config.Common);
|
||||
return _client;
|
||||
}), config.Common);
|
||||
|
||||
while (true)
|
||||
{
|
||||
|
|
|
@ -27,7 +27,7 @@ namespace FastTunnel.Core.Core
|
|||
System.Timers.Timer timer_timeout;
|
||||
System.Timers.Timer timer_heart;
|
||||
|
||||
Func<Connecter> login;
|
||||
Task<Connecter> login;
|
||||
double heartInterval = 10 * 1000; // 10 秒心跳
|
||||
public DateTime lastHeart;
|
||||
Thread th;
|
||||
|
@ -74,7 +74,7 @@ namespace FastTunnel.Core.Core
|
|||
_logger.LogDebug($"last heart recived {span / 1000}s ago");
|
||||
|
||||
// 重新登录
|
||||
reConnect();
|
||||
reConnectAsync();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -87,19 +87,19 @@ namespace FastTunnel.Core.Core
|
|||
}
|
||||
}
|
||||
|
||||
private void reConnect()
|
||||
private async Task reConnectAsync()
|
||||
{
|
||||
Close();
|
||||
try
|
||||
{
|
||||
_client = login.Invoke();
|
||||
_client = await login;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex.Message);
|
||||
|
||||
Thread.Sleep(reTrySpan);
|
||||
reConnect();
|
||||
reConnectAsync();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -124,25 +124,25 @@ namespace FastTunnel.Core.Core
|
|||
}
|
||||
}
|
||||
|
||||
public void Login(Func<Connecter> fun, SuiDaoServer serverConfig)
|
||||
public async Task LoginAsync(Task<Connecter> fun, SuiDaoServer serverConfig)
|
||||
{
|
||||
_serverConfig = serverConfig;
|
||||
|
||||
login = fun;
|
||||
try
|
||||
{
|
||||
_client = login.Invoke();
|
||||
_client = await login;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex.Message);
|
||||
|
||||
Thread.Sleep(reTrySpan);
|
||||
reConnect();
|
||||
reConnectAsync();
|
||||
return;
|
||||
}
|
||||
|
||||
LogSuccess(_client.Socket);
|
||||
//LogSuccess(_client.Socket);
|
||||
}
|
||||
|
||||
void Close()
|
||||
|
|
|
@ -199,6 +199,7 @@ namespace FastTunnel.Core.Core
|
|||
}
|
||||
|
||||
byte[] buffer = new byte[1024 * 1024];
|
||||
string temp = string.Empty;
|
||||
|
||||
public void ReceiveClient(Socket client, object _)
|
||||
{
|
||||
|
@ -235,14 +236,38 @@ namespace FastTunnel.Core.Core
|
|||
|
||||
// 将字节转换成字符串
|
||||
string words = Encoding.UTF8.GetString(buffer, 0, length);
|
||||
words += temp;
|
||||
temp = string.Empty;
|
||||
|
||||
try
|
||||
{
|
||||
if (HandleWords(words, client).NeedRecive)
|
||||
int index = 0;
|
||||
bool needRecive = false;
|
||||
|
||||
while (true)
|
||||
{
|
||||
var firstIndex = words.IndexOf("\n");
|
||||
if (firstIndex < 0)
|
||||
{
|
||||
temp += words;
|
||||
ReceiveClient(client, _);
|
||||
break;
|
||||
}
|
||||
|
||||
var sub_words = words.Substring(index, firstIndex + 1);
|
||||
var res = handle(sub_words, client);
|
||||
|
||||
if (res.NeedRecive)
|
||||
needRecive = true;
|
||||
|
||||
words = words.Replace(sub_words, string.Empty);
|
||||
if (string.IsNullOrEmpty(words))
|
||||
break;
|
||||
}
|
||||
|
||||
if (needRecive)
|
||||
{
|
||||
// 递归
|
||||
ReceiveClient(client, _);
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -255,25 +280,6 @@ namespace FastTunnel.Core.Core
|
|||
}
|
||||
}
|
||||
|
||||
private IServerHandler HandleWords(string words, Socket client)
|
||||
{
|
||||
// 同时读到两个或多个指令
|
||||
var index = words.IndexOf("\n");
|
||||
if (index > 0)
|
||||
{
|
||||
_logger.LogError($"读到多个消息 {words}");
|
||||
var sub_words = words.Substring(0, index + 1);
|
||||
var left = words.Substring(index + 1);
|
||||
|
||||
handle(sub_words, client);
|
||||
return HandleWords(left, client);
|
||||
}
|
||||
else
|
||||
{
|
||||
return handle(words, client);
|
||||
}
|
||||
}
|
||||
|
||||
private IServerHandler handle(string words, Socket client)
|
||||
{
|
||||
Message<JObject> msg = JsonConvert.DeserializeObject<Message<JObject>>(words);
|
||||
|
|
Loading…
Reference in New Issue
Block a user