mirror of
https://github.com/snltty/linker.git
synced 2025-10-28 11:21:49 +08:00
桌面共享使用打洞或者服务器中继进行代理
This commit is contained in:
@@ -12,7 +12,6 @@ namespace cmonitor.plugins.tunnel.server
|
||||
|
||||
public Action<object, Socket> OnTcpConnected { get; set; } = (state, socket) => { };
|
||||
public Action<object, UdpClient> OnUdpConnected { get; set; } = (state, udpClient) => { };
|
||||
public Action<object> OnDisConnected { get; set; } = (state) => { };
|
||||
|
||||
private ConcurrentDictionary<int, SocketAsyncEventArgs> acceptBinds = new ConcurrentDictionary<int, SocketAsyncEventArgs>();
|
||||
|
||||
@@ -85,9 +84,6 @@ namespace cmonitor.plugins.tunnel.server
|
||||
case SocketAsyncOperation.Accept:
|
||||
ProcessAccept(e);
|
||||
break;
|
||||
case SocketAsyncOperation.Receive:
|
||||
ProcessReceive(e);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -119,87 +115,6 @@ namespace cmonitor.plugins.tunnel.server
|
||||
}
|
||||
}
|
||||
|
||||
public void BindReceive(Socket socket, object state, OnTunnelData dataCallback)
|
||||
{
|
||||
if (socket == null || socket.RemoteEndPoint == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
socket.KeepAlive();
|
||||
AsyncUserToken userToken = new AsyncUserToken
|
||||
{
|
||||
SourceSocket = socket,
|
||||
State = state,
|
||||
OnData = dataCallback,
|
||||
LocalPort = (socket.LocalEndPoint as IPEndPoint).Port,
|
||||
};
|
||||
|
||||
SocketAsyncEventArgs readEventArgs = new SocketAsyncEventArgs
|
||||
{
|
||||
UserToken = userToken,
|
||||
SocketFlags = SocketFlags.None,
|
||||
};
|
||||
readEventArgs.SetBuffer(new byte[8 * 1024], 0, 8 * 1024);
|
||||
readEventArgs.Completed += IO_Completed;
|
||||
if (socket.ReceiveAsync(readEventArgs) == false)
|
||||
{
|
||||
ProcessReceive(readEventArgs);
|
||||
}
|
||||
}
|
||||
private async void ProcessReceive(SocketAsyncEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
AsyncUserToken token = (AsyncUserToken)e.UserToken;
|
||||
|
||||
if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
|
||||
{
|
||||
int offset = e.Offset;
|
||||
int length = e.BytesTransferred;
|
||||
|
||||
await token.OnData(token, e.Buffer.AsMemory(0, length));
|
||||
if (token.SourceSocket.Available > 0)
|
||||
{
|
||||
while (token.SourceSocket.Available > 0)
|
||||
{
|
||||
length = token.SourceSocket.Receive(e.Buffer);
|
||||
if (length > 0)
|
||||
{
|
||||
await token.OnData(token, e.Buffer.AsMemory(0, length));
|
||||
}
|
||||
else
|
||||
{
|
||||
CloseClientSocket(e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (token.SourceSocket.Connected == false)
|
||||
{
|
||||
CloseClientSocket(e);
|
||||
return;
|
||||
}
|
||||
|
||||
if (token.SourceSocket.ReceiveAsync(e) == false)
|
||||
{
|
||||
ProcessReceive(e);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CloseClientSocket(e);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Logger.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
Logger.Instance.Error(ex);
|
||||
|
||||
CloseClientSocket(e);
|
||||
}
|
||||
}
|
||||
private void CloseClientSocket(SocketAsyncEventArgs e)
|
||||
{
|
||||
if (e == null || e.UserToken == null) return;
|
||||
@@ -214,7 +129,6 @@ namespace cmonitor.plugins.tunnel.server
|
||||
{
|
||||
CloseClientSocket(saea1);
|
||||
}
|
||||
OnDisConnected(token.State);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,9 +140,6 @@ namespace cmonitor.plugins.tunnel.server
|
||||
public Socket SourceSocket { get; set; }
|
||||
public SocketAsyncEventArgs Saea { get; set; }
|
||||
public object State { get; set; }
|
||||
|
||||
public OnTunnelData OnData { get; set; }
|
||||
|
||||
public int LocalPort { get; set; }
|
||||
|
||||
public void Clear()
|
||||
|
||||
Reference in New Issue
Block a user