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