Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
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.
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 SQ
L 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& i
nsertedId)
at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affected
Rows, 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 be
havior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandB
ehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[]
datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand co
mmand, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startR
ecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
at TCPServidor.Module1.TCPServidor.Main()
O que acham?
Você tem um erro na query cara, por isso que ele mostra a mensagem.
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?
O problema é que você está inserindo um valor que contém apóstrofos, ou seja, ele está confundindo sua string com o seu dado.
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?
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.
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.