|
|
|
@ -0,0 +1,109 @@ |
|
|
|
|
using System; |
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
using System.IO; |
|
|
|
|
using System.Linq; |
|
|
|
|
using System.Net; |
|
|
|
|
using System.Net.Sockets; |
|
|
|
|
using System.Security.Cryptography; |
|
|
|
|
using System.Text; |
|
|
|
|
using System.Threading.Tasks; |
|
|
|
|
|
|
|
|
|
namespace ConsoleApp.TelnetSamples |
|
|
|
|
{ |
|
|
|
|
internal class AsyncSocketTelnetClient : IAsyncTelnetClient |
|
|
|
|
{ |
|
|
|
|
private readonly CancellationTokenSource CTS = new CancellationTokenSource(); |
|
|
|
|
|
|
|
|
|
public event EventHandler<string> MessageCallback; |
|
|
|
|
|
|
|
|
|
private Socket _socket; |
|
|
|
|
|
|
|
|
|
public async void Connect(string ip, int port = 23) |
|
|
|
|
{ |
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
Task.Run(ReadAsync); |
|
|
|
|
} |
|
|
|
|
catch (Exception) |
|
|
|
|
{ |
|
|
|
|
throw; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private async void ReadAsync() |
|
|
|
|
{ |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
StringBuilder sb = new StringBuilder(); |
|
|
|
|
byte[] readBuffer = new byte[1024]; |
|
|
|
|
while (true) |
|
|
|
|
{ |
|
|
|
|
int bytesRead = await _socket.ReceiveAsync(readBuffer); |
|
|
|
|
if (bytesRead < 1) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
string data = Encoding.ASCII.GetString(readBuffer, 0, bytesRead); |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public async void SendCommand(string command) |
|
|
|
|
{ |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
command += "\r\n"; |
|
|
|
|
byte[] sendBytes = Encoding.ASCII.GetBytes(command); |
|
|
|
|
await _socket.SendAsync(sendBytes); |
|
|
|
|
} |
|
|
|
|
catch (Exception) |
|
|
|
|
{ |
|
|
|
|
throw; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void Close() |
|
|
|
|
{ |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
if (_socket == null) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
_socket.Shutdown(SocketShutdown.Both); |
|
|
|
|
_socket.Close(); |
|
|
|
|
_socket.Dispose(); |
|
|
|
|
} |
|
|
|
|
catch (Exception) |
|
|
|
|
{ |
|
|
|
|
throw; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |