Socket.BeginSend - нужно ли ждать окончания?
От: Аноним  
Дата: 10.06.13 18:58
Оценка: :)
Делаю рассылку клиентам. Почему-то, если я отправляю массово BeginSend (в цикле), то на клиент приходит мусор. Если делаю синхронный Send, то все нормально. Данные где-то мешаются? Разве TCP не гарантирует последовательность? Я понимаю, что тут не просто TCP, но еще и асинхронные порты, но они они вроде как должны гарантировать порядок? Или я ошибаюсь.

Поток отправки данных один. Берет, что рассылать, из очереди.
Re: Socket.BeginSend - нужно ли ждать окончания?
От: hardcase Пират http://nemerle.org
Дата: 11.06.13 08:58
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Делаю рассылку клиентам. Почему-то, если я отправляю массово BeginSend (в цикле), то на клиент приходит мусор. Если делаю синхронный Send, то все нормально. Данные где-то мешаются? Разве TCP не гарантирует последовательность? Я понимаю, что тут не просто TCP, но еще и асинхронные порты, но они они вроде как должны гарантировать порядок? Или я ошибаюсь.


Буфер в BeginSend передается каждый раз свой? Код в студию.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Socket.BeginSend - нужно ли ждать окончания?
От: Sinatr Германия  
Дата: 11.06.13 06:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>если я отправляю массово BeginSend (в цикле), то на клиент приходит мусор


Синхронизировать BeginSend в callback'е нужно. Была похожая проблема, правда с SerialPort.Write и с потоками, решается элементарно с помощью lock.
---
ПроГLамеры объединяйтесь..
Re[2]: Socket.BeginSend - нужно ли ждать окончания?
От: Аноним  
Дата: 11.06.13 07:59
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>Синхронизировать BeginSend в callback'е нужно. Была похожая проблема, правда с SerialPort.Write и с потоками, решается элементарно с помощью lock.


Не совсем понять, локировать какую именно область?
Re[2]: Socket.BeginSend - нужно ли ждать окончания?
От: Аноним  
Дата: 11.06.13 13:16
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Буфер в BeginSend передается каждый раз свой? Код в студию.


Я немного с ламбдами поигрался, может что там напортачил:

foreach (var message in messages)
    clientStream.SafeWriteBuffer(Extensions.Encoding.GetBytes(message), this.AddErrorLog);


// а это методы-расширения

public static void SafeWriteBuffer(this Stream clientStream, byte[] buffer, Action<Exception> errorHandler)
{
    clientStream.SafeWrite(((ushort)buffer.Length).To<byte[]>(),
        () => clientStream.SafeWrite(buffer, () => { }, errorHandler), errorHandler);
}

public static void SafeWrite(this Stream clientStream, byte[] buffer, Action complete, Action<Exception> errorHandler)
{
    clientStream.BeginWrite(buffer, 0, buffer.Length, ar =>
    {
        try
        {
            clientStream.EndWrite(ar);
            complete();
        }
        catch (Exception ex)
        {
            errorHandler(ex);
        }
    }, null);
}
Re[3]: Socket.BeginSend - нужно ли ждать окончания?
От: matumba  
Дата: 13.06.13 14:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А> clientStream.BeginWrite(buffer, 0, buffer.Length, ar =>

А> clientStream.EndWrite(ar);

Кста, что за ar вы передаёте в EndWrite? Разве туда не суётся IAsyncResult, возвращаемый BeginWrite?
Re[4]: Socket.BeginSend - нужно ли ждать окончания?
От: Аноним  
Дата: 13.06.13 14:37
Оценка:
Здравствуйте, matumba, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>> clientStream.BeginWrite(buffer, 0, buffer.Length, ar =>

А>> clientStream.EndWrite(ar);

M>Кста, что за ar вы передаёте в EndWrite? Разве туда не суётся IAsyncResult, возвращаемый BeginWrite?


http://msdn.microsoft.com/library/system.asynccallback.aspx Все как в МСДН
Re[3]: Socket.BeginSend - нужно ли ждать окончания?
От: Аноним  
Дата: 14.06.13 11:24
Оценка:
Здравствуйте, Аноним, Вы писали:

Нашел причину. Всем спасибо.
Re[4]: Socket.BeginSend - нужно ли ждать окончания?
От: Ночной Смотрящий Россия  
Дата: 14.06.13 14:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нашел причину. Всем спасибо.


Ну так назови ее нам.
Re[5]: Socket.BeginSend - нужно ли ждать окончания?
От: Аноним  
Дата: 14.06.13 17:38
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, Аноним, Вы писали:


А>>Нашел причину. Всем спасибо.


НС>Ну так назови ее нам.


Дрол ее знает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.