public void ASSocketClose(ASSocketPacket _SocketPacket) { _SocketPacket._Socket.Shutdown(SocketShutdown.Both); _SocketPacket._Socket.Close(); _SocketPacket._Socket = null; _SocketPacket = null; }
private void TheadWaitOne() { try { if (WorkerCallBack == null) { //Cria o evento assíncrono que será disparado quando ocorrer um imput //de dados WorkerCallBack = new AsyncCallback(OnDataReceived); } // Encapsula o client socket solicitante e o clientNumber. ASSocketPacket _SocketPacket = new ASSocketPacket(); _SocketPacket._Socket = _ClientSocket; //Inicializa a recepção assíncrona dos Dados AsyncResult = _ClientSocket.BeginReceive(_SocketPacket.dataBuffer, 0, _SocketPacket.dataBuffer.Length, SocketFlags.None, WorkerCallBack, _SocketPacket); } catch (SocketException se) { throw (se); } }
private void OnDataReceived(IAsyncResult asyn) { ASSocketPacket socketData = (ASSocketPacket)asyn.AsyncState; try { lock (this) { int ResultBytesLength = socketData._Socket.EndReceive(asyn); if (ResultBytesLength <= 0) { this.ASSocketClose(socketData); return; } char[] charsLength = new char[ResultBytesLength]; System.Text.Decoder _Decoder = System.Text.Encoding.UTF8.GetDecoder(); _Decoder.GetChars( socketData.dataBuffer, 0, ResultBytesLength, charsLength, 0); int BufferSize = 0; int pos = 0; BufferSize += (((int)socketData.dataBuffer[pos++]) & 0xFF) << 24; BufferSize += (((int)socketData.dataBuffer[pos++]) & 0xFF) << 16; BufferSize += (((int)socketData.dataBuffer[pos++]) & 0xFF) << 8; BufferSize += (((int)socketData.dataBuffer[pos++]) & 0xFF); byte[] dataBuffer = new byte[BufferSize]; int BytesReceive = socketData._Socket.Receive(dataBuffer, dataBuffer.Length, SocketFlags.None ); char[] charLenght = new char[BytesReceive]; string Message = string.Empty; System.Text.Decoder decoder = System.Text.Encoding.UTF8.GetDecoder(); decoder.GetChars( dataBuffer, 0, BytesReceive, charLenght, 0); Message += new string(charLenght); if (BytesReceive < BufferSize) { Message += ReceiveData( BytesReceive, BufferSize, socketData._Socket ); } // Rebate a mensagem apenas substituindo o tipo para A3 Message = Message.Replace("A2", "A3"); // Realiza a conexão com o MDS e solicita Login. MDSPackageSocket _ClientSocket = new MDSPackageSocket(); _ClientSocket.OpenConnection(); _ClientSocket.SendData(Message.ToString(), true); // Apos envias a mensagem fecha a conexão. this.ASSocketClose(socketData); } } catch (SocketException se) { if (se.ErrorCode == (int)(SocketError.ConnectionReset)) { this.ASSocketClose(socketData); } } catch (Exception ex) { throw ex; } }
private void OnDataReceived(IAsyncResult asyn) { string Instrumento = string.Empty; ASSocketPacket socketData = (ASSocketPacket)asyn.AsyncState; try { lock (this) { int ResultBytesLength = socketData._Socket.EndReceive(asyn); // Falha de conexão. if (ResultBytesLength <= 0) { logger.Warn("Encerrou conexao com MDS (" + ResultBytesLength + ") recebendo tamanho"); this.ASSocketClose(socketData); return; } // Se recebeu menos que 4 bytes, recebe os bytes restantes para compor o tamanho while (ResultBytesLength < 4) { int BytesReceived = socketData._Socket.Receive(socketData.dataBuffer, ResultBytesLength, 4 - ResultBytesLength, SocketFlags.None); if (BytesReceived <= 0) { logger.Warn("Encerrou conexao com MDS (" + ResultBytesLength + ") recebendo complemento do tamanho"); this.ASSocketClose(socketData); return; } ResultBytesLength += BytesReceived; } char[] charsLength = new char[ResultBytesLength]; System.Text.Decoder _Decoder = System.Text.Encoding.UTF8.GetDecoder(); _Decoder.GetChars( socketData.dataBuffer, 0, ResultBytesLength, charsLength, 0); int BufferSize = 0; int pos = 0; BufferSize += (((int)socketData.dataBuffer[pos++]) & 0xFF) << 24; BufferSize += (((int)socketData.dataBuffer[pos++]) & 0xFF) << 16; BufferSize += (((int)socketData.dataBuffer[pos++]) & 0xFF) << 8; BufferSize += (((int)socketData.dataBuffer[pos++]) & 0xFF); int TotalBytesReceived = 0; string Message = string.Empty; while (TotalBytesReceived < BufferSize) { int ToReceive = BufferSize - TotalBytesReceived; byte[] dataBuffer = new byte[ToReceive]; int BytesReceived = socketData._Socket.Receive(dataBuffer, ToReceive, SocketFlags.None ); if (BytesReceived <= 0) { logger.Warn("Encerrou conexao com AuthenticationServer (" + ResultBytesLength + ") recebendo dados"); this.ASSocketClose(socketData); return; } char[] charLenght = new char[BytesReceived]; System.Text.Decoder decoder = System.Text.Encoding.UTF8.GetDecoder(); decoder.GetChars(dataBuffer, 0, BytesReceived, charLenght, 0); Message += new string(charLenght); TotalBytesReceived += BytesReceived; } if ((Message != null) || (Message != "")) { ThreadPool.QueueUserWorkItem(new WaitCallback( delegate(object required) { this.MessageBroker(Message); })); } ThreadWaitOne(); } } catch (SocketException se) { logger.Error("OnDataReceived(SocketEx): " + se.Message + " ErrorCode: " + se.ErrorCode + " Native: " + se.NativeErrorCode + " SocketError: " + se.SocketErrorCode, se); logger.Warn("OnDataReceived(): Encerrando conexao com MDS"); // Falha de conexão this.ASSocketClose(socketData); } catch (Exception ex) { logger.Error("OnDataReceived(): " + ex.Message, ex); this.ASSocketClose(socketData); } }