Pergunta

Aqui está um cenário com soquetes assíncronos que não entendo muito bem...Eu tenho 2 soquetes TCP, um soquete de cliente e um soquete de servidor.Meu soquete de servidor está vinculado e escutando em uma porta.

Meus soquetes de cliente se conectam ao soquete do servidor (usando BeginConnect/EndConnect).Em seguida, envio uma mensagem ao servidor usando BeginSend().No lado do servidor, não faço Receive() ou BeginReceive().

O que acontece é que meu AsyncCallback especificado para minha chamada BeginSend é invocado e seu IAsyncResult me ​​diz que foi concluído e a chamada para Socket.EndSend() não gera nenhuma exceção...

Existe algo que eu não entendo ou meu AsyncCallback não deveria ser chamado apenas se a chamada BeginSend realmente enviar algo para o servidor (ou seja:retorno de chamada chamado depois que o servidor recebeu todos os bytes)?Se não houve recebimento no servidor, meu retorno de chamada não deveria ser chamado após o sendtimeout expirar e minha chamada para Socket.EndSend geraria uma exceção?

Obrigado

Foi útil?

Solução

Não, o TCP/IP cuida de tudo isso para você.Existem buffers em ambos os lados da conexão que reterão os dados até que possam ser recebidos.Sem o buffer, provavelmente haveria uma latência horrível ao enviar comunicação tagarela.

Pense nisso como enviar uma carta.Ele fica na sua caixa de correio até que o carteiro o pegue.Quando isso acontecer, ele será enviado.Ainda não foi recebido.Pode estar em trânsito ou aguardando na caixa de correio para leitura.

Portanto, obter o retorno de chamada após BeginSend apenas informa que foi enviado.A única maneira de saber com certeza se a outra parte recebeu e processou os dados é solicitar algum tempo de confirmação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top