C#で非同期ソケット通信
ブラウザでlocalhost:portを開いてチェック。
Programs.cs
using System; using System.Collections.Generic; using System.Text; namespace Spider { class Program { static void Main(string[] args) { NetworkListener n = new NetworkListener(); n.beginListener(); } } }
NetworkStateObject.cs
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; namespace Spider { class NetworkStateObject { public Socket workSocker = null; public const int BufferSize = 1024; public byte[] buffer = new byte[BufferSize]; public StringBuilder sb = new StringBuilder(); } }
Network.cs
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace Spider { class NetworkListener { private ManualResetEvent threadControl; public int port; public NetworkListener() { threadControl = new ManualResetEvent(false); port = 1111; } public void beginListener() { IPHostEntry ipHostEntry = Dns.GetHostEntry(Dns.GetHostName()); // select IPv4 address IPAddress ipv4 = null; foreach (IPAddress ip in ipHostEntry.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { ipv4 = ip; } } if (ipv4 == null) { Console.WriteLine("IPv4 is not exist!"); return; } IPEndPoint localEP = new IPEndPoint(ipv4, this.port); Socket listener = new Socket(localEP.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { listener.Bind(localEP); listener.Listen(100); while (true) { threadControl.Reset(); listener.BeginAccept(new AsyncCallback(acceptCallback), listener); threadControl.WaitOne(); } } catch (Exception e) { Console.WriteLine(e.ToString()); } } public void acceptCallback(IAsyncResult aResult) { threadControl.Set(); Socket socket = (Socket)aResult.AsyncState; Socket handler = socket.EndAccept(aResult); NetworkStateObject state = new NetworkStateObject(); state.workSocker = handler; handler.BeginReceive(state.buffer, 0, NetworkStateObject.BufferSize, 0, new AsyncCallback(readCallback),state); } public void readCallback(IAsyncResult aResult) { NetworkStateObject state = (NetworkStateObject)aResult.AsyncState; Socket handler = state.workSocker; int read = handler.EndReceive(aResult); if (read > 0) { state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, read)); handler.BeginReceive(state.buffer, 0, NetworkStateObject.BufferSize, 0, new AsyncCallback(readCallback), state); } else { if (state.sb.Length > 1) { string content = state.sb.ToString(); Console.WriteLine("read: {0}", content); } handler.Close(); } } } }