C # Begin Send в проблеме цикла foreach - PullRequest
0 голосов
/ 22 декабря 2010

У меня есть группа «Пакетов», которые классифицируются по индивидуальному заказу, которые покрываются байтом [] и затем отправляются клиенту. Когда клиент присоединяется, он обновляется предыдущими «пакетами захвата», которые были отправлены до присоединения пользователя. Думайте об этом как о комнате чата, где вы будете в курсе предыдущих разговоров.

Моя проблема на стороне клиента, мы не получаем всю информацию; Иногда совсем нет ..

Ниже приведен псевдо-код C # для того, что я вижу

код выглядит следующим образом.

lock(CatchUpQueue.SyncRoot)
{
     foreach(Packet packet in CatchUpQueue)
     {
           // If I put Console.WriteLine("I am Sending Packets"); It will work fine up to (2) client sockets else if fails again.
          clientSocket.BeginSend(data, 0, data.length, SocketFlags.None, new AsyncCallback(EndSend), data);
     }
}

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

Я искал похожую тему и не могу ее найти. Спасибо за вашу помощь.

Изменить: Я также хотел бы отметить, что отправка между клиентами продолжается нормально для любых отправлений после подключения клиента. Но по какой-то причине пакеты в этом цикле for отправляются не все.

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

Я подозреваю, что вы заполняете порт TCP пакетами и, возможно, переполняете его буфер отправки, и в этот момент он, вероятно, будет возвращать ошибки, а не отправлять данные.

Идея асинхронного ввода-выводане для того, чтобы позволить вам одновременно отправлять бесконечное количество пакетов данных, а для того, чтобы ваш приоритетный поток мог продолжить обработку, пока линейная последовательность одной или нескольких операций ввода-вывода происходит в фоновом режиме.

Поскольку поток TCP является последовательным потоком, попробуйте соблюсти это и отправляйте каждый пакет по очереди.То есть после BeginSend используйте функцию обратного вызова Async, чтобы определить, когда отправка была завершена, прежде чем отправлять снова.Вы эффективно делаете это, добавляя Sleep, но это не очень хорошее решение (вы либо будете отправлять пакеты медленнее, чем это возможно, либо вы не будете спать достаточно долго, и пакеты будут снова потеряны)

Или, если вам не нужен ввод / вывод для выполнения в фоновом режиме, используйте простой цикл foreach, но используйте синхронную, а не асинхронную отправку.

0 голосов
/ 22 декабря 2010

Хорошо,

По-видимому, исправление, которое до сих пор путает меня, - это Thread.Sleep для количества мс для каждого отправляемого пакета.

Итак ...

for(int i = 0; i < PacketQueue.Count; i++)
{
     Packet packet = PacketQueue[i];
     clientSocket.BeginSend(data, 0, data.length, SocketFlags.None, new AsyncCallback(EndSend), data);
     Thread.Sleep(PacketQueue.Count);
} 

Я предполагаю, что по какой-то причине цикл останавливает некоторые вызовы ... Что ж, я продолжу работать с этим и попытаюсь найти реальный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...