/// <summary>
 /// Open a new client with default settings (everything beside accept is set to asynchronic).
 /// </summary>
 public NetworkClientBase(CommunicationSettings clientCommunicationSettings)
 {
     clientMode = NetworkClientMode.None;
     this.clientCommunicationSettings = clientCommunicationSettings;
     skt = new NetworkSocketManagerTCP();
     skt.OnSocketEvent += new NetworkSocketManagerTCP.DelegateSocketEventMethod(skt_OnSocketEvent);
 }
 /// <summary>
 /// Open a new client by attaching an existing socket.
 /// </summary>
 /// <param name="socketManagerTCP">The socket to attach.</param>
 public NetworkClientBase(NetworkSocketManagerTCP socketManagerTCP)
 {
     clientMode = NetworkClientMode.None;
     skt = socketManagerTCP;
     skt.OnSocketEvent += new NetworkSocketManagerTCP.DelegateSocketEventMethod(skt_OnSocketEvent);
 }
 private void Async_Accept_Callback(IAsyncResult ar)
 {
     bool bError = false;
     NetworkSocketManagerTCP AcceptingSocket = null;
     try
     {
         Socket sktAccepted = skt.EndAccept(ar);
         AcceptingSocket = new NetworkSocketManagerTCP(sktAccepted);
     }
     catch { bError = true; }
     if (OnSocketEvent != null)
     {
         if (bError)
             OnSocketEvent.BeginInvoke(SocketEventTypeEnum.Error, "Async_Accept_Callback Failed.", null, null);
         else
             OnSocketEvent.BeginInvoke(SocketEventTypeEnum.Accepted, AcceptingSocket, null, null);
     }
 }
        private void skt_OnSocketEvent(NetworkSocketManagerTCP.SocketEventTypeEnum EventType, object EventData)
        {
            switch (EventType)
            {
                case NetworkSocketManagerTCP.SocketEventTypeEnum.None:
                    if (OnClientEvent != null)
                        OnClientEvent.BeginInvoke(ClientEventTypeEnum.None, EventData, null, null);
                    break;
                case NetworkSocketManagerTCP.SocketEventTypeEnum.Connected:
                    if (OnClientEvent != null)
                        OnClientEvent.BeginInvoke(ClientEventTypeEnum.Connected, EventData, null, null);
                    break;
                case NetworkSocketManagerTCP.SocketEventTypeEnum.Accepted:
                    if (OnClientEvent != null)
                    {
                        NetworkClientBase nwcbAccepter =
                            new NetworkClientBase((NetworkSocketManagerTCP)EventData);
                        OnClientEvent.BeginInvoke(ClientEventTypeEnum.Accepted, nwcbAccepter, null, null);
                    }
                    break;
                case NetworkSocketManagerTCP.SocketEventTypeEnum.DataSent:
                    if (OnClientEvent != null)
                        OnClientEvent.BeginInvoke(ClientEventTypeEnum.MessageSent, EventData, null, null);
                    break;
                case NetworkSocketManagerTCP.SocketEventTypeEnum.DataRecieved:
                    if (((byte[])EventData).Length > 0)
                    {
                        if (OnClientEvent != null)
                            OnClientEvent.BeginInvoke(ClientEventTypeEnum.RawDataRecieved,
                               ((byte[])EventData), null, null);

                        incommingData = ByteArrayOperations.AddByteArrays(incommingData, (byte[])EventData);
                        byte[] data = null;
                        while (ApplicationLayerTransmitionControl.IsIntegratedDataWaiting(incommingData))
                        {
                            data = ApplicationLayerTransmitionControl.
                                ExtractIntegratedDataFromBuffer(ref incommingData);
                            if (OnClientEvent != null)
                                OnClientEvent.BeginInvoke(ClientEventTypeEnum.MessageRecieved,
                                          data, null, null);
                        }
                        if (incommingData.Length > 0) Recieve();
                    }
                    else if (OnClientEvent != null)
                        OnClientEvent.BeginInvoke(ClientEventTypeEnum.Disconnected, EventData, null, null);
                    break;
                case NetworkSocketManagerTCP.SocketEventTypeEnum.Disconnected:
                    skt.Dispose();
                    if (OnClientEvent != null)
                        OnClientEvent.BeginInvoke(ClientEventTypeEnum.Disconnected, EventData, null, null);
                    break;
                case NetworkSocketManagerTCP.SocketEventTypeEnum.RemoteSideDisconnected:
                    Disconnect();
                    if (OnClientEvent != null)
                        OnClientEvent.BeginInvoke(ClientEventTypeEnum.RemoteSideDisconnected, EventData, null, null);
                    break;
                case NetworkSocketManagerTCP.SocketEventTypeEnum.Error:
                    if (OnClientEvent != null)
                        OnClientEvent.BeginInvoke(ClientEventTypeEnum.Error, EventData, null, null);
                    break;
            }
        }
 /// <summary>
 /// Accept synchronic.
 /// </summary>
 public void Sync_Accept()
 {
     bool bError = false;
     bool bAcceptInvoked = false;
     NetworkSocketManagerTCP acceptingSocket = null;
     try
     {
         if (BlockingMode)
         {
             bAcceptInvoked = true;
             Socket sktAccepted = skt.Accept();
             acceptingSocket = new NetworkSocketManagerTCP(sktAccepted);
         }
         else //not blocking mode, check if a socket is pending.
             if (skt.Poll(1000, SelectMode.SelectRead))
             {
                 bAcceptInvoked = true;
                 Socket sktAccepted = skt.Accept();
                 acceptingSocket = new NetworkSocketManagerTCP(sktAccepted);
             }
     }
     catch { bError = true; }
     if (OnSocketEvent != null)
     {
         if (bError)
             OnSocketEvent.BeginInvoke(SocketEventTypeEnum.Error, "Sync_Accept Failed.", null, null);
         else
             if(bAcceptInvoked)
                 OnSocketEvent.BeginInvoke(SocketEventTypeEnum.Accepted, acceptingSocket, null, null);
     }
 }