SOCKET DE COMUNICACAO

NALDOXD 21/06/2013 10:07:46
#425057
Bom dia galerinha, olha eu aqui denovo..rsrs, pessoal agora estou tendo dúvidas com o namespace *System.Net.Sockets;
O que estou querendo fazer é bem simples, quero mandar um comando para a máquina que esta no ip 192.168.0.106 porta 1957, até ai tudo bem a comunicação esta funcionando minha dúvida agora é qual a forma correta de mandar um comando e receber, para enviar estou tentando: binaryWriter.Write([Ô]!50,R,001,1,4A[Ô]); e para receber: message = binaryReader.ReadString(); mas sem sucesso :(, em anexo um print do código...

@Simplificando eu quero escrever a string !50,R,001,1,4A e obter um retorno do aparelho.
OCELOT 21/06/2013 10:42:56
#425060
Comunicação por rede é algo simples, porém não é fácil de entender para quem nunca trabalhou com isso.

Apesar de você não ter falado nada sobre [Ô]pacotes[Ô] no seu post, sempre é bom lembrar que não existem pacotes em comunicação TCP, os dados que você envia separados podem chegar juntos, os que envia junto podem chegar separados, um único dado que você envie se for grande o suficiente pode chegar em duas partes. As únicas garantias que você tem no TCP é que os dados sempre chegam (salvo o caso da conexão cair) e eles sempre vão chegar na mesma ordem em que forem enviados.

Daí você tem que ver que a mensagem pode demorar para chegar no destino e a resposta dela pode demorar mais ainda, tentar enviar e já ler a resposta do jeito que você faz não vai funcionar. O loop também geralmente vai ser apenas para receber as mensagens, do jeito que você colocou vai estar enviando várias vezes a mesma mensagem, sem nem mesmo ter recebido nada

Como não se tem garantia de que você vai receber a mensagem inteira, ou se vai receber apenas uma mensagem você precisa criar um buffer onde vai adicionando tudo que chegou no final dele, dai sempre que receber algo você verifica se já tem a mensagem inteira no começo do buffer, se sim você remove essa mensagem do começo do buffer, deixando qualquer outra coisa que já esteja nele lá, e então processa a mensagem, terminando de processar ela você já verifica se ainda tem mais alguma mensagem inteira no buffer e fica repetindo isso até não ter mais nada ou pelo menos não ter mais nenhuma mensagem inteira no buffer, quando isso ocorrer você volta a esperar que chegue mais alguma informação

Na maioria das vezes que trabalhei com comunicação por rede eu usei o Socket diretamente, mas pelo que vi aqui com o TcpClient me parece que você pode usar o BinaryReader e o BinaryWriter para ler e gravar dados no NetwortkStream mesmo
NALDOXD 21/06/2013 11:45:49
#425063
Eu fiz umas correções, porque esse código eu peguei da net... eu tirei o do e mandei escrever só uma vez, criei uma thread e deixei um lanço lendo para ver se teria algum retorno, mas acho que os paramêtros que estou enviando não está batendo, vou tentar dar uma olhada aqui e já entro em contato novamente, OCELOT teria como criar um function com o que você falou? sem querer abusar é claro, fico grato e entendi o que você quis dizer, na questão de perder pacote acho que nos testes não teremos problemas pois estou testando em uma máquina virtual mas futuramente hora que colocar em produção pode ser que ocorra e essa questão do buffer é bem interessante, se você poder criar um projetinho teste ficaria muito grato!! até daqui a pouco.
ALEVALE 21/06/2013 14:41:26
#425070
NALDOXD 21/06/2013 14:49:23
#425071
ALEVALE, estarei olhando sim.. Obrigado por colaborar! :D
Faça seu login para responder