using global::System.Net; using global::System.Net.Sockets; using System.Threading.Tasks; namespace Pilz.Networking { public class TCPManager : ConnectionManagerBase { private readonly TcpListener listener; public int BufferSize { get; set; } = 10240; public TCPManager(int port) : base(port) { listener = new TcpListener(IPAddress.Any, port); } public override void Start() { if (!IsListening) { listener.Start(); IsListening = true; Task.Run(CheckRetriveData); } } public override void Stop() { if (IsListening) { IsListening = false; listener.Stop(); } } protected override int GetBufferSize() { return BufferSize; } private void CheckRetriveData() { while (IsListening) { if (listener.Pending()) { var tcp = listener.AcceptTcpClient(); string ip = ((IPEndPoint)tcp.Client.RemoteEndPoint).Address.ToString(); var Stream = tcp.GetStream(); var buf = new byte[BufferSize]; tcp.ReceiveBufferSize = BufferSize; Stream.Read(buf, 0, buf.Length); tcp.Close(); ProcessRetrivedData(ip, buf); } } } protected override void SendData(IPEndPoint ep, byte[] buf) { var tcp = new TcpClient(); tcp.SendBufferSize = BufferSize; tcp.Connect(ep); var stream = tcp.GetStream(); // Send Data stream.Write(buf, 0, buf.Length); stream.Flush(); tcp.Client.Shutdown(SocketShutdown.Both); tcp.Close(); } } }