notax 0 Denunciar post Postado Abril 9, 2013 Pessoal, td legal? Seguinte: to trabalhando num socket que recebe "pacotes" TCP em uma determinada porta... Tá tudo quase perfeito. Recebo os pacotes, consigo salvar no banco... tudo certinho... O problema é o seguinte, os dados que estou recebendo são inúteis... não estou entendendo... mas não estou conseguindo decodificar os dados para uma forma aproveitável... Atualmente estou fazendo assim (conforme aprendi em um tutorial): Dim bytes(tcpClient.ReceiveBufferSize) As Byte networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize)) ' Retorna os dados recebidos do cliente para o console Dim clientdata As String = Encoding.ASCII.GetString(bytes) Console.WriteLine(("Cliente enviou : " + clientdata)) Esta mesma variável clientdata estou inserindo no bd... Mas ela vem praticamente sem dado nenhum... no final das contas isso deveria ser traduzido em uma string grnade de aproximademente 500 caracteres.... mas não... acaba imprimindo em tela e salvando no bd no máximo uns 20 caracteres e bem esquisitos... Será que alguem tem algum palpite? Compartilhar este post Link para o post Compartilhar em outros sites
KhaosDoctor 242 Denunciar post Postado Abril 9, 2013 O que pode ser é que o seu campo do banco de dados não está comportando tudo, você pode usar o tipo TEXT ao invés de VARCHAR ou, se o pacote vem em binário você pode criar um BLOB e jogar tudo dentro, depois você decodifica com o streamReader. Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Capella 7 Denunciar post Postado Abril 9, 2013 isso aconteceu comigo uma vez. por increvel que pareça ele dava problema com isso: Encoding.ASCII.GetString(bytes) ai tentei esse: Encoding.Default.GetString e funcionou. agora não entendi o porque da diferença, mas no meu caso funcionou. Compartilhar este post Link para o post Compartilhar em outros sites
notax 0 Denunciar post Postado Abril 9, 2013 Bom, o campo já está tipo blob... e mesmo tipo text, longblob ou longtext deu no mesmo... Fiz a alteração para Encoding.Default.GetString e o erro mudou... agora acredito que seja em função de um apostrofe... mas aí é que está... o erro mudou mas o problema é praticamente o mesmo... eu não deveria estar recebendo nenhum apostrofe... apenas números... segue erro: Cliente enviou : ☺¢1Â←\z¶D%ß%°♠6þ6íóü►!¤►0 ♫►$☻"¶Ì►3M'+►$←►!'Ï ¼; Û¬♦ MySql.Data.MySqlClient.MySqlException (0x80004005): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '►$←►!'Ï' at line 1 at MySql.Data.MySqlClient.MySqlStream.ReadPacket() at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId) at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId) at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) at MySql.Data.MySqlClient.MySqlDataReader.NextResult() at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) at TCPServidor.Module1.TCPServidor.Main() O que acham? Compartilhar este post Link para o post Compartilhar em outros sites
KhaosDoctor 242 Denunciar post Postado Abril 10, 2013 Você tem um erro na query cara, por isso que ele mostra a mensagem. Compartilhar este post Link para o post Compartilhar em outros sites
notax 0 Denunciar post Postado Abril 10, 2013 Na query? Mas ela é muito simples: SQL = "insert into pacotes (pacote) values ('" + clientdata + "')" De qq forma, como vê ali em tela... aquilo não é o que eu deveria ter recebido via tcp... será que estou resgatando isso da forma correta? Compartilhar este post Link para o post Compartilhar em outros sites
KhaosDoctor 242 Denunciar post Postado Abril 11, 2013 O problema é que você está inserindo um valor que contém apóstrofos, ou seja, ele está confundindo sua string com o seu dado. Compartilhar este post Link para o post Compartilhar em outros sites
notax 0 Denunciar post Postado Abril 11, 2013 Hahahah... mas exatamente essa é a minha dúvida, conforme escrevi lá no 4! Olha eu pensei em fazer um tratamento na string e dar um replace desses apostrofes por outra coisa qq ou mesmo dar um encodehtml na string... mas a questão não é essa... a questão principal é que eu sigo não recebendo o dado verdadeiro que supostamente está entrando via tcp... O resgate está certo? Tem alguma outra forma de resgate? Outra dúvida: via tcp obrigatoriamente recebo em binários? Enfim... por aí vão minhas dúvidas... rola um help? Compartilhar este post Link para o post Compartilhar em outros sites
KhaosDoctor 242 Denunciar post Postado Abril 11, 2013 Bom, vou resolver as suas dúvidas, para não precisar fazer esse tratamento, use uma criptografia em AES, assim você criptografa o arquivo, guarda e depois descriptografa. O resgate é pelo select, não existe outra forma. Sim, o TCP sempre vai te enviar pacotes binários, isso significa que seu campo não pode ser varchar nem text, deve ser Varbinary se for SQLServer ou LongBlob se for MySQL. Compartilhar este post Link para o post Compartilhar em outros sites