|
|
|
@ -0,0 +1,172 @@ |
|
|
|
|
using System; |
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
using System.Diagnostics; |
|
|
|
|
using System.Linq; |
|
|
|
|
using System.Net; |
|
|
|
|
using System.Net.Sockets; |
|
|
|
|
using System.Text; |
|
|
|
|
using System.Threading; |
|
|
|
|
using System.Threading.Tasks; |
|
|
|
|
|
|
|
|
|
namespace TelnetCommunicator.Telnet |
|
|
|
|
{ |
|
|
|
|
public enum TelnetMode |
|
|
|
|
{ |
|
|
|
|
Continuously = 0, |
|
|
|
|
Once, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public class AsyncSocketTelnetClient |
|
|
|
|
{ |
|
|
|
|
public event EventHandler<string> MessageCallback; |
|
|
|
|
|
|
|
|
|
private Socket _socket; |
|
|
|
|
private Thread _readThread; |
|
|
|
|
|
|
|
|
|
public async Task Connect(string ip, int port = 23, TelnetMode mode = TelnetMode.Continuously) |
|
|
|
|
{ |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
Close(); |
|
|
|
|
|
|
|
|
|
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); |
|
|
|
|
_socket.ReceiveTimeout = 1000; |
|
|
|
|
|
|
|
|
|
IPAddress ipAddress = Dns.GetHostAddresses(ip)[0]; |
|
|
|
|
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port); |
|
|
|
|
await _socket.ConnectAsync(ipEndPoint); |
|
|
|
|
|
|
|
|
|
switch (mode) |
|
|
|
|
{ |
|
|
|
|
case TelnetMode.Continuously: |
|
|
|
|
_readThread = new Thread(ReadAsync); |
|
|
|
|
break; |
|
|
|
|
case TelnetMode.Once: |
|
|
|
|
_readThread = new Thread(ReadAsyncOnce); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_readThread.Start(); |
|
|
|
|
} |
|
|
|
|
catch (Exception) |
|
|
|
|
{ |
|
|
|
|
throw; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private async void ReadAsync() |
|
|
|
|
{ |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
StringBuilder sb = new StringBuilder(); |
|
|
|
|
byte[] readBuffer = new byte[1024]; |
|
|
|
|
|
|
|
|
|
while (true) |
|
|
|
|
{ |
|
|
|
|
int readByte = _socket == null ? 0 : await _socket.ReceiveAsync(readBuffer, SocketFlags.None); |
|
|
|
|
if (readByte < 1) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
string data = Encoding.ASCII.GetString(readBuffer, 0, readByte); |
|
|
|
|
sb.Append(data); |
|
|
|
|
|
|
|
|
|
if (!data.EndsWith("\r\n>")) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
// 에코 삭제 |
|
|
|
|
string read = sb.ToString(); |
|
|
|
|
int rnIdx = read.IndexOf("\r\n"); |
|
|
|
|
read = read.Substring(rnIdx + 1); |
|
|
|
|
|
|
|
|
|
if (this.MessageCallback != null) |
|
|
|
|
this.MessageCallback(this, read); |
|
|
|
|
|
|
|
|
|
sb.Clear(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
catch (Exception) |
|
|
|
|
{ |
|
|
|
|
throw; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private async void ReadAsyncOnce() |
|
|
|
|
{ |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
StringBuilder sb = new StringBuilder(); |
|
|
|
|
byte[] readBuffer = new byte[1024]; |
|
|
|
|
|
|
|
|
|
while (true) |
|
|
|
|
{ |
|
|
|
|
int readByte = _socket == null ? 0 : await _socket.ReceiveAsync(readBuffer, SocketFlags.None); |
|
|
|
|
if (readByte < 1) |
|
|
|
|
{ |
|
|
|
|
if (sb.Length > 0 && this.MessageCallback != null) |
|
|
|
|
this.MessageCallback(this, sb.ToString()); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
string data = Encoding.ASCII.GetString(readBuffer, 0, readByte); |
|
|
|
|
sb.Append(data); |
|
|
|
|
|
|
|
|
|
if (!data.EndsWith("\r\n>")) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
// 에코 삭제 |
|
|
|
|
string read = sb.ToString(); |
|
|
|
|
int rnIdx = read.IndexOf("\r\n"); |
|
|
|
|
read = read.Substring(rnIdx + 1); |
|
|
|
|
|
|
|
|
|
if (this.MessageCallback != null) |
|
|
|
|
this.MessageCallback(this, read); |
|
|
|
|
|
|
|
|
|
sb.Clear(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Close(); |
|
|
|
|
} |
|
|
|
|
catch (Exception) |
|
|
|
|
{ |
|
|
|
|
throw; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public async Task SendMessage(string message) |
|
|
|
|
{ |
|
|
|
|
if (_socket == null) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
message += "\r\n"; |
|
|
|
|
byte[] sendBuffer = Encoding.ASCII.GetBytes(message); |
|
|
|
|
await _socket.SendAsync(sendBuffer, SocketFlags.None); |
|
|
|
|
} |
|
|
|
|
catch (Exception) |
|
|
|
|
{ |
|
|
|
|
throw; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void Close() |
|
|
|
|
{ |
|
|
|
|
if (_socket == null) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
_socket.Shutdown(SocketShutdown.Both); |
|
|
|
|
|
|
|
|
|
//_readThread.Abort(); |
|
|
|
|
_socket.Close(); |
|
|
|
|
_socket.Disconnect(true); |
|
|
|
|
_socket.Dispose(); |
|
|
|
|
} |
|
|
|
|
catch (Exception) |
|
|
|
|
{ |
|
|
|
|
throw; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |