All pastes #495953 Raw Edit

Asynchronous Server

public text v1 · immutable
·published 2007-05-18 23:34 UTC
rendered paste body
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Server
{
    class Server
    {
        private TcpListener listener;
        private ManualResetEvent reset;

        public delegate void MessageReceived(string msg);
        public event MessageReceived OnMessageReceived;

        public delegate void ClientConnected(TcpClient client);
        public event ClientConnected OnClientConnected;

        public Server(int port)
        {
            this.listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, port));
            this.reset = new ManualResetEvent(false);
        }

        public void Start()
        {
            this.listener.Start();
            this.reset.Reset();
            this.listener.BeginAcceptTcpClient(new AsyncCallback(acceptTcpClient), this.listener);
            this.reset.WaitOne();
        }

        private void acceptTcpClient(IAsyncResult asyn)
        {
            TcpClient client = this.listener.EndAcceptTcpClient(asyn);
            this.OnClientConnected.Invoke(client);
            this.reset.Set();

            byte[] recvBuffer = new byte[1024];
            client.Client.BeginReceive(recvBuffer, 0, 0, SocketFlags.None,
                new AsyncCallback(beginReceive), client);
            this.OnMessageReceived.Invoke(Encoding.ASCII.GetString(recvBuffer));
        }

        private void beginReceive(IAsyncResult asyn)
        {
            TcpClient client = (TcpClient)asyn.AsyncState;

            int bytes = client.Client.EndReceive(asyn);
        }
    }
}