Ir para conteúdo
Fórum Script Brasil
  • 0

Falha No Envio Através Do Tcp


Lucas Phillip

Pergunta

Olá,

pessoal o negócio é o seguinte: tenho um programa que se conecta a um servidor através do protocolo tcp. Até ai tudo bem. O problema é que quando muitas pessoas se conectam ao servidor, as vezes ocorre de alguém mandar alguma informação e tal informação simplesmente sumir. Não aparece nenhum erro nem nada, simplesmente a informação "some".

Eu andei lendo alguns livros e vi que utilizando udp, as vezes ocorre isso mesmo da informação sumir sem explicação :blink: (pelo menos foi o que entendi hehe). Bom, minha dúvida é se utilizando TCP, há alguma chance da informação se "perder" no caminho ou ela obrigatoriamente irá chegar ao destino. porque caso seja a segunda situação, o problema está realmente no meu código e vou ter que quebrar a cabeça para achar.

Vlw :D

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
Olá,

pessoal o negócio é o seguinte: tenho um programa que se conecta a um servidor através do protocolo tcp. Até ai tudo bem. O problema é que quando muitas pessoas se conectam ao servidor, as vezes ocorre de alguém mandar alguma informação e tal informação simplesmente sumir. Não aparece nenhum erro nem nada, simplesmente a informação "some".

Eu andei lendo alguns livros e vi que utilizando udp, as vezes ocorre isso mesmo da informação sumir sem explicação :blink: (pelo menos foi o que entendi hehe). Bom, minha dúvida é se utilizando TCP, há alguma chance da informação se "perder" no caminho ou ela obrigatoriamente irá chegar ao destino. porque caso seja a segunda situação, o problema está realmente no meu código e vou ter que quebrar a cabeça para achar.

Vlw :D

Depende muito, meu amigo, porque as vezes, o problema pode ser fisico. Você disse que se conecta com um servidor, bem, então voce concorda que o dado tem que seguir um caminho físico até o servidor, correto?

Durante esse caminho, podem acontecer coisas para que o dado se perca... O mais comum é interferencia eletromagnética. Pode ser temperatura tambem, exposição do cabo, etc, etc, etc. Agora, sobre o código perder dados, acho díficil, mais acho que isso pode ser facilmente arrumado. Você pode fazer com que o programa no servidor responda se o dado chegou ou não. Não sei que tipo de transmisão você está utilizando, mais em transmissões assincronas, existe um bit de paridade, que determina se o dado chegou perfeitamente ou não.

Flws!

Link para o comentário
Compartilhar em outros sites

  • 0
Não sei que tipo de transmisão você está utilizando, mais em transmissões assincronas, existe um bit de paridade, que determina se o dado chegou perfeitamente ou não.

Flws!

O negócio é que minhas transmissões são sincronas... não tem uma função parecida para elas não?

ah, e outra, acredito que o problema não seja fixo, porque o erro não ocorre com poucas pessoas conectadas.

Link para o comentário
Compartilhar em outros sites

  • 0
Não sei que tipo de transmisão você está utilizando, mais em transmissões assincronas, existe um bit de paridade, que determina se o dado chegou perfeitamente ou não.

Flws!

O negócio é que minhas transmissões são sincronas... não tem uma função parecida para elas não?

Então, deixa eu te explicar: eu nunca programei nada parecido, mais como sou técnico em informática industrial, sei bastante dessas coisas porque o objetivo do meu curso era integrar eletrônica com informática. Então, eu só vou poder te explicar eletrônicamente, e já que informática é eletrônica pura, você se vira com o código, beleza? está vendo, isso não era marketing pessoal, huaauha!!!

O problema da trasmissão síncrona é a seguinte: Digamos que você transmita do seu PC á 10 MB/s. Se na estação de destino, o dado chegar á 9MB/s, ferro, para não dizer outra palavra. O receptor e o emissor tem tanto que enviar quanto que receber na mesma velocidade. Se isso não acontecer, OS DADOS SÂO PERDIDOS NA TRANSMISSÃO. E meu amigo, isso é uma desgraça. Como disse, várias situações podem e vão interferir na sua transmissão, principalmente quando ela é sincrona, os principais são interfêrencias eletromagnéticas e temperatura. Então, o que eu teria em mente poderia ser isso: Não sei como funciona aí, mais pra esses dados serem transmitidos, eles tem que ser transformados em bytes. Quando digo bytes, é o codigo binário do próprio. Nesse dado binário, você poderia incluir então um bit de paridade. Assim dá pra saber se o dado chegou corretamente do outro lado. Mais ai você teria de saber como os dados são transformados, se você tem que transformar, isso fica mais fácil.

Tenta isso, se não conseguir, existem outras soluções...

Flws!

Link para o comentário
Compartilhar em outros sites

  • 0

Hmm... acho que vou tentar primeiro as outras opções hehe... eu não sabia dessa ai que você falou da conexão síncrona. muito bom saber por sinal. Então vo utiliza o caminho mais facil. Vou mudar para uma conexão assíncrona (como o Graymalkin me sugeriu em outro tópico) e ver no que da :ph34r:

Qualquer coisa eu do o retorno depois ;)

Vlw

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, vale lembrar que quando falamos da questão do síncrono vs assíncrono estamos falando da camada de aplicação. O protocolo TCP é da camada de transporte e uma das vantagens dele sobre o UDP é justamente a verificação automática de integridade de dados. Ou seja, você não precisa se preocupar em se certificar de que os dados chegaram corretamente, já que esta é uma tarefa do protocolo. Outra questão na qual não precisamos nos preocupar é com a velocidade da conexão, já que os dados transmitidos via TCP obedecem a uma MTU (Unidade Máxima de Transmissão).

Ou seja, o foco aqui, trabalhando-se com o protocolo TCP, é outro bem diferente. Tudo que o Andersonjb falou não deixa de ser válido, porém ele está falando sobre a camada de transporte, a qual não precisamos nos preocupar, já que o TCP já é um protocolo desta camada.

Recomendo dar uma lida sobre o TCP e sobre o modelo OSI: http://pt.wikipedia.org/wiki/TCP e http://pt.wikipedia.org/wiki/Modelo_OSI

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Bom, vale lembrar que quando falamos da questão do síncrono vs assíncrono estamos falando da camada de aplicação. O protocolo TCP é da camada de transporte e uma das vantagens dele sobre o UDP é justamente a verificação automática de integridade de dados. Ou seja, você não precisa se preocupar em se certificar de que os dados chegaram corretamente, já que esta é uma tarefa do protocolo. Outra questão na qual não precisamos nos preocupar é com a velocidade da conexão, já que os dados transmitidos via TCP obedecem a uma MTU (Unidade Máxima de Transmissão).

Ou seja, o foco aqui, trabalhando-se com o protocolo TCP, é outro bem diferente. Tudo que o Andersonjb falou não deixa de ser válido, porém ele está falando sobre a camada de transporte, a qual não precisamos nos preocupar, já que o TCP já é um protocolo desta camada.

Recomendo dar uma lida sobre o TCP e sobre o modelo OSI: http://pt.wikipedia.org/wiki/TCP e http://pt.wikipedia.org/wiki/Modelo_OSI

Abraços,

Graymalkin

Nossa, eu nunca ouvi falar desse UDP... É um protocolo anterior ao TCP?

Link para o comentário
Compartilhar em outros sites

  • 0
Nossa, eu nunca ouvi falar desse UDP... É um protocolo anterior ao TCP?

Eu não sei te falar se ele é mais antigo ou não, mas posso te dar o exemplo que tinha no livro. De acordo com livro (que não lembro o nome), TCP se assemelha a uma ligação telefonica, com as conexões ligadas ao mesmo, enquanto o UDP funcionaria como os correios, onde as "cartas" são enviadas, não havendo uma conexão ativa o tempo todo. (O exemplo era parecido com isso. Não me interessava muito então só dei uma lida rápida)

De qualquer forma, eu estava lendo la sobre TCP no wikipedia e fiquei com uma duvida. Bom, se com TCP não preciso me preocupar se a informação chegou ou não e "usa várias técnicas para proporcionar uma entrega confiável dos pacotes de dados", porque isso estava falhando no meu código.

Eu fiz um teste, colocando o comando de enviar "write" em um for. Então, ao invés do servidor enviar uma mensagem, ele enviaria 10 seguidas. O resultado foi que cada hora aparecia um número de mensagens diferentes. As vezes chegava apenas 1 mensagem, as vezes chegava 2 ou 3, mas nunca as 10. Depois eu diminui o loop para apenas 2 mensagens seguidas e todas chegavam sem problemas. Eu parei pra pensar então e acho que talvez descobri o porque de alguns pacotes simplesmente sumirem, quando há muitos usuários online.

Acredito que o um pacote falha, devido ao fato do programa ainda está processando a última mensagem recebida e não ter voltado a "escutar" por pacotes novos. Se isso for o caso, a solução seria criar uma fila de espera de pacotes, onde todos fosse recebidos e colocados em um array, para depois serem processados.

Viajei muito ou posso estar correto? hehe..

Vlw

Link para o comentário
Compartilhar em outros sites

  • 0
Nossa, eu nunca ouvi falar desse UDP... É um protocolo anterior ao TCP?

Não, os dois são "colegas". Se você não precisa de confiabilidade e precisa mais é de velocidade (por exemplo, para transmitir um fluxo de vídeo), o UDP é o mais indicado no caso. Programas como o eMule, por exemplo, usam os dois protocolos (provavelmente o TCP é para transmissão dos arquivos, enquanto o UDP deve ser para buscas).

Acredito que o um pacote falha, devido ao fato do programa ainda está processando a última mensagem recebida e não ter voltado a "escutar" por pacotes novos. Se isso for o caso, a solução seria criar uma fila de espera de pacotes, onde todos fosse recebidos e colocados em um array, para depois serem processados.

Viajei muito ou posso estar correto? hehe..

É bem provável que você esteja correto. Quando se trabalha de forma síncrona pode ser necessário ter um tipo de controle assim. Sendo que isso também pode variar de acordo com o jeito que foi implementado. De qualquer maneira, ainda recomendo você tentar usar métodos assíncronos para verificar se melhora a velocidade (e também se sana este problema de envio e recepção).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...