ALTERAR SENDBUFFERSIZE

D4RK.V1RU5 13/08/2012 17:43:39
#407867
Olá Pessoal,

Estou com grande dúvida e não achei em lugar algum a solução. Estou enviando um bloco de dados pelo tcpclient. Queria que o bloco fosse todo de uma só vez, tentei de toda forma mas no máximo ele envia em parte (de 8192 bytes cada) . Pesquisei como aumentar isso e encontrei a propriedade sendbuffersize, mas não importa se eu coloco ela muito alta ou baixa, continuo recebendo o bloco em várias partes de 8192 bytes. Segue o código que estou usando para enviar:
  
Dim erro As String = [Ô][Ô]
Dim bytes_enviar() As Byte

If socket.Connected = False Then

socket.Connect(Host, CInt(Port))

If socket.Connected = True Then
FrmPrincipal.Text = [Ô]Conectado[Ô]
Else
FrmPrincipal.Text = [Ô]Desconectado[Ô]
End If
End If
socket.SendBufferSize = 100000

Try
If socket.Connected = True Then FrmPrincipal.Text = [Ô]Enviando[Ô]
Dim Stream As NetworkStream = socket.GetStream()

Stream.Write(bytes_enviar, 0, bytes_enviar.Length)
Stream.Flush()

Catch ex As Exception
socket.Close()
erro = ex.Message
FrmPrincipal.Text = [Ô]Problema de Conexão[Ô]
End Try

socket.Close()
JABA 13/08/2012 18:00:21
#407869
O buffer de rede deve ser pelo menos tão grande como o buffer do aplicativo para garantir que os dados desejados serão armazenados e enviados em uma única operação.

vlw
JABA 13/08/2012 18:02:32
#407870
veja se isso aqui te ajuda:

http://www.tabernaculodafejau.org.br/ajuda.php

vlw
D4RK.V1RU5 13/08/2012 18:04:15
#407871
E teria como eu mudar via código isso?
JABA 13/08/2012 18:25:45
#407875
Cara, provavelmente tem sim. Eu não tenho nada aqui a respeito.

Se eu te ajudei com sua duvida encerre o topico e me pontue!!!!
D4RK.V1RU5 13/08/2012 18:34:46
#407876
mas o estranho é que mesmo eu colocando o sendbuffersize bem baixo (100, 10) continuo a receber 8192 bytes ....
JABA 13/08/2012 18:40:11
#407877
Veja no parametros do metodo Write do socket se tem alguma coisa referente ao buffer.

vlw
OCELOT 13/08/2012 21:51:49
#407889
Não tem como garantir que vai chegar de uma vez só os dados, assim como não tem como garantir que vai chegar separado dados enviados em sequencia, essa é a forma que o TCP/IP funciona, os dados podem ser fragmentados tanto pelo sistema operacional quanto por um roteador ou gateway pelo qual o pacote passe.

O correto quando se faz comunicação por TCP/IP é você criar um buffer no seu programa para ir guardando os dados até chegar tudo que precisa para executar, e ainda tem que tomar cuidado pois caso você envie vários dados em sequencia que devem ser tratados independentemente, você deve separar eles manualmente.

Geralmente quando eu preciso mandar dados pela rede eu incluo alguns bytes a mais no começo para informar o que é para ser feito e se necessário o tamanho do pacote de dados, por exemplo adiciona 3 bytes, o primeiro contém um número que indica o que é aquele pacote e os dois segundos são o tamanho total do pacote, incluindo estes 3 bytes, assim quando chegam os bytes primeiro de tudo eu coloco eles no final do meu buffer, então eu verifico o primeiro byte do buffer para saber qual é o tipo do pacote, se aquele tipo envia o tamanho então eu verifico se já recebi 3 bytes, se sim eu leio nos próximos 2 bytes o tamanho que tem que ser esse pacote, se o que já está no buffer for maior ou igual ao tamanho informado eu retiro exatamente este tamanho do buffer e executo a ação, logo em seguida já olhando no que sobrou no buffer e fazendo tudo de novo até o buffer estar vazio ou não ter dados suficientes ainda para executar a ação, onde no caso eu esperaria então chegar mais dados para voltar a executar esta rotina.
Tópico encerrado , respostas não são mais permitidas