Вопрос

Как и в приведенном ниже упрощенном коде, правильна ли проверка того, что SendAsync() завершила передачу всех предназначенных байтов в буфере?Или это излишне?Это для сокета TCP-соединения.Меня особенно беспокоит необходимость выполнить второй вспомогательный вызов SendAsync() внутри ProcessSend().

Например, если бы у меня было несколько потоков, передающих данные клиенту, используя новый (объединенный) SocketAsyncEventArg для каждого сообщения, разве не возможно, что одновременная отправка могла бы вставляться между частично переданным сообщением?Или это хорошая причина для контролируемого доступа к клиенту, поскольку при отправке данных разрешается использовать только один SocketAsyncEventArg?

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);
        }
    }
}
Это было полезно?

Решение

Я подозреваю, что вы читаете пример на http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx и увидеть, что они проверяют длину байта в ProcessReceive.

Это сделано для того, чтобы получить все полученные байты, поскольку вы не можете контролировать, сколько байтов каждый раз отправляется от другой стороны.

Когда вы выполняете отправку, это излишне, поскольку платформа обрабатывает отправку всех ваших данных за вас.

Другие советы

Я думаю, что в вашем коде что-то не так:

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

e.Count - это количество байтов для передачи, это не смещение в массив байтов.

Итак, чтобы сравнить яблоки с яблоками, вы бы сказали:

если (например, переданный байт < e.Количество) { }

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top