예제 #1
0
 private void HandleDatagramReceived(IAsyncResult AsyncResult)
 {
     if (isrunning)
     {
         TcpClientState tcpClientState    = (TcpClientState)AsyncResult.AsyncState;
         NetworkStream  networkStream     = tcpClientState.networkStream;
         int            numberOfReadBytes = 0;
         try
         {
             numberOfReadBytes = networkStream.EndRead(AsyncResult);
         }
         catch
         {
             numberOfReadBytes = 0;
         }
         if (numberOfReadBytes == 0)
         {
             lock (this.clients)
             {
                 this.clients.Remove(tcpClientState);
                 RaiseClientDisconnected(tcpClientState.tcpClient);
                 return;
             }
         }
         byte[] receivedBytes = new byte[numberOfReadBytes];
         Buffer.BlockCopy(tcpClientState.buffer, 0, receivedBytes, 0, numberOfReadBytes);
         RaiseDatagramReceived(tcpClientState.tcpClient, receivedBytes);
         networkStream.BeginRead(tcpClientState.buffer, 0, tcpClientState.buffer.Length, HandleDatagramReceived, tcpClientState);
     }
 }
예제 #2
0
 void MT_OnClientDisconnected(TcpClientState client)
 {
     lock (dataQueue) {
         dataQueue.Enqueue(new EventData(EventType.Disconnect, client.Sid, null));
     }
     lock (clients) {
         clients.Remove(client.Sid);
     }
 }
예제 #3
0
 void MT_OnClientConnected(TcpClientState client)
 {
     lock (clients) {
         clients[client.Sid] = client;
     }
     lock (dataQueue) {
         dataQueue.Enqueue(new EventData(EventType.Connect, client.Sid, null));
     }
 }
예제 #4
0
    private void server_Received(object sender, TcpDatagramReceivedEventArgs <byte[]> e)
    {
        Debug.Log(string.Format("Client : {0} --> {1}",
                                e.Client.TcpClient.Client.RemoteEndPoint.ToString(), e.Datagram.Length));
        TcpClientState internalClient = e.Client;
        string         tcpClientKey   = internalClient.TcpClient.Client.RemoteEndPoint.ToString();

        inbox.AddOrUpdate(tcpClientKey, internalClient, (n, o) => {
            return(internalClient);
        });
    }
예제 #5
0
        private void HandleTcpClientAccepted(IAsyncResult AsyncResult)
        {
            if (isrunning)
            {
                TcpListener    tcpListener    = (TcpListener)AsyncResult.AsyncState;
                TcpClient      tcpClient      = tcpListener.EndAcceptTcpClient(AsyncResult);
                TcpClientState tcpClientState = new TcpClientState(tcpClient);
                lock (this.clients)
                {
                    this.clients.Add(tcpClientState);
                    RaiseClientConnected(tcpClient);
                    //_connectionIndex = this.clients.IndexOf(tcpClientState);
                    //_bufferIndex = (++_bufferIndex) % BUFCOUNT;
                }

                NetworkStream networkStream = tcpClientState.networkStream;
                networkStream.BeginRead(tcpClientState.buffer, 0, tcpClientState.buffer.Length, HandleDatagramReceived, tcpClientState);
                tcpListener.BeginAcceptTcpClient(HandleTcpClientAccepted, AsyncResult.AsyncState);
            }
        }
예제 #6
0
 void MT_OnDatagramReceived(TcpClientState client, byte[] data)
 {
     lock (dataQueue) {
         dataQueue.Enqueue(new EventData(EventType.Data, client.Sid, data));
     }
 }