Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

notax

socket

Recommended Posts

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

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

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

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.