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 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; } } } }