Pergunta

Como no código simplificado abaixo, a verificação está a verificação de que o sendAsync () terminou de transmitir todos os bytes pretendidos no buffer a coisa correta a fazer? Ou isso é redundante? Isto é para um soquete de conexão TCP. Estou particularmente preocupado em ter que emitir uma segunda subcall para sendAsync () Inside ProcessSend ().

Por exemplo, se eu tivesse vários threads transmitindo dados para um cliente usando um novo soquete (combinado) SocketasynceventArg para cada mensagem, não é possível que um envio simultâneo possa se interromper entre uma mensagem parcialmente transmitida? Ou esse é um bom motivo para o acesso controlado ao cliente, permitindo apenas que um soquetesynceventArg seja usado no envio de dados?

private void ProcessSend(SocketAsyncEventArgs e)
{
    // Check that data was sent
    if ((e.SocketError == SocketError.Success) && (e.BytesTransferred > 0))
    {
        AsyncSendUserToken token = (AsyncSendUserToken)e.UserToken;

        // Check that all the data was sent
        int offset = e.Offset + e.BytesTransferred;
        if (offset < e.Count)
        {
            // Call send again to finish the send
            e.SetBuffer(offset, e.Count - offset);
            bool _willRaiseEvent = token.Socket.SendAsync(e);
            if (!_willRaiseEvent)
                ProcessSend(e);
        }
    }
}
Foi útil?

Solução

Eu suspeito que você esteja lendo o exemplo em http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventArgs.aspx e veja que eles estão verificando o comprimento do byte no processo.

Isso é feito para receber todos os bytes recebidos, pois você não tem controle sobre quantos bytes são enviados da outra parte a cada vez.

Quando você executa um envio, isso é redundante à medida que a estrutura lida enviando todos os seus dados para você.

Outras dicas

Eu acho que há algo errado no seu código:

// Check that all the data was sent
int offset = e.Offset + e.BytesTransferred;
if (offset < e.Count)
{

E.Count é o número de bytes para transferir, não é um deslocamento para a matriz de bytes.

Então, para comparar maçãs com maçãs, você diria:

if (e.bytestransfered <E.Count) {}

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