Example #1
0
        private void WaitForData(Socket socket, int clientNumber)
        {
            try{
                if (WorkerCallBack == null)
                {
                    WorkerCallBack = new AsyncCallback(OnDataReceivedNoSize);
                }


                ClientSocketPacket _SocketPacket =
                    new ClientSocketPacket(socket, clientNumber);


                socket.BeginReceive(_SocketPacket.sizeBuffer, 0,
                                    _SocketPacket.sizeBuffer.Length,
                                    SocketFlags.None,
                                    WorkerCallBack,
                                    _SocketPacket
                                    );
            }
            catch (SocketException se)
            {
                logger.Error("WaitForData(): " + se.Message, se);
                throw se;
            }
        }
Example #2
0
        private void NotificaClienteDesconectado(object objeto)
        {
            ClientSocketPacket socketData = (ClientSocketPacket)objeto;

            ClientDisconnectedEventArgs args = new ClientDisconnectedEventArgs();

            args.ClientNumber = socketData.ClientNumber;
            args.ClientSocket = socketData.CurrentSocket;

            if (OnClientDisconnected != null)
            {
                OnClientDisconnected(this, args);
            }
        }
Example #3
0
        private void OnDataReceivedNoSize(IAsyncResult asyn)
        {
            ClientSocketPacket socketData = (ClientSocketPacket)asyn.AsyncState;

            try
            {
                lock (this)
                {
                    int ResultBytesLength = socketData.CurrentSocket.EndReceive(asyn);

                    if (ResultBytesLength <= 0)
                    {
                        logger.Warn("Encerrou conexao (" + ResultBytesLength + ") recebendo tamanho");
                        ThreadPool.QueueUserWorkItem(new WaitCallback(NotificaClienteDesconectado), socketData);
                        this.CloseSocket(socketData.CurrentSocket);
                        return;
                    }

                    LastPacket = DateTime.Now;

                    MessageEventArgs args = new MessageEventArgs();

                    args.ClientNumber = socketData.ClientNumber;
                    args.ClientSocket = socketData.CurrentSocket;
                    args.Message      = new byte[ResultBytesLength];
                    Array.Copy(socketData.sizeBuffer, args.Message, ResultBytesLength);
                    args.MessageLen = ResultBytesLength;

                    qMsg.Enqueue(args);

                    if (DateTime.UtcNow.Ticks - lastLogSEC > TimeSpan.TicksPerSecond)
                    {
                        lastLogSEC = DateTime.UtcNow.Ticks;
                        logger.Info("Pacotes compactados na fila: " + qMsg.Count);
                    }

                    //ThreadPool.QueueUserWorkItem(new WaitCallback(MessageBrokerNoSize), args);

                    this.WaitForData(socketData.CurrentSocket, socketData.ClientNumber);
                }
            }
            catch (SocketException se)
            {
                //if (se.ErrorCode == (int)(SocketError.ConnectionReset)){
                //    this.CloseSocket(socketData.CurrentSocket);
                //}
                logger.Error("OnDataReceivedNoSize(SocketEx): " + se.Message + " ErrorCode: " + se.ErrorCode +
                             " Native: " + se.NativeErrorCode +
                             " SocketError: " + se.SocketErrorCode, se);

                logger.Warn("OnDataReceivedNoSize(): Encerrando conexao com o gateway");

                ThreadPool.QueueUserWorkItem(new WaitCallback(NotificaClienteDesconectado), socketData);

                // Falha de conexão
                this.CloseSocket(socketData.CurrentSocket);
            }
            catch (Exception ex)
            {
                logger.Error("OnDataReceivedNoSize(): " + ex.Message, ex);
            }
        }