сетевой дизайн; связь через сокет с использованием опроса - PullRequest
0 голосов
/ 02 марта 2009

Несколько слов о текущем проектировании и реализации

Я отправляю много запросов удаленному приложению (запущенному на другом хост, конечно), а приложение отправляет обратно данные.

О клиенте

Клиент - это пользовательский интерфейс, который порождает отдельный поток для отправки и обработки запросов. Как только он отправляет все запросы, он вызывает Wait. И Wait будет анализировать все события, поступающие в приложение, и вызывать обратные вызовы клиента.

Ниже приведена реализация Wait.

public void Wait (uint milliseconds)
{
       while(_socket.IsConnected)
       {
         if (_socket.Poll(milliseconds, SelectMode.SelectRead))
         {
              // read info of the buffer and calls registered callbacks for the client
              if(_socket.IsAvailable > 0)
                    ProcessSocket(socket);
         }
         else
            return; //returns after Poll has expired
      }
}

Wait вызывается из отдельного потока, отвечающего за управление сетевым подключением: как входящий, так и исходящий трафик:

         _Receiver = new Thread(DoWork);
         _Receiver.IsBackground = true;
         _Receiver.Start(this);

Этот поток создается из компонента пользовательского интерфейса приложения.

Выпуск:

клиент иногда видит задержки в обратных вызовах, даже если основное приложение отправило данные вовремя. Примечательно, что одно сообщение в опросе было отложено до тех пор, пока клиент не отключился, и внутренне я позвонил:

_socket.Shutdown(SocketShutdown.Both);

Мне кажется, что-то странное происходит в опросе

Любые предложения о том, как решить проблему или альтернативное решение?

Спасибо

пожалуйста, дайте мне знать, если что-то неясно

Ответы [ 2 ]

1 голос
/ 03 марта 2009

Пара вещей. Во-первых, в вашем примере, есть ли разница между "_socket" и "socket"? Во-вторых, вы используете класс System.Net.Sockets.Socket, верно? Я не вижу свойства IsConnected или IsAvailable для этого класса в документации MSDN ни для одной версии .NET, начиная с версии 1.1. Я полагаю, что это обе опечатки, верно?

Вы пытались поместить предложение "else" в тест "IsAvailable> 0" и записать сообщение в окно консоли / вывода, например,

  if (_socket.IsAvailable > 0) {
      ProcessSocket(socket);
  } else {
      Console.WriteLine("Poll() returned true but there is no data");
  }

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

Кроме того, я не большой поклонник опросных сокетов для данных. Как альтернатива, есть ли причина не использовать асинхронные функции Begin / EndReceive в сокете? Я думаю, что было бы просто перейти на асинхронную модель, учитывая тот факт, что вы уже используете отдельный поток для отправки и получения ваших данных. Вот пример от MSDN. Кроме того, я добавил типичную реализацию, которую я использую для этого механизма, к этой публикации SO .

0 голосов
/ 02 марта 2009

Какой поток вызывает метод Wait ()? Если вы просто добавляете его в пул потоков пользовательского интерфейса, возможно, именно поэтому вы иногда испытываете задержки. Если это ваша проблема, то используйте системный пул потоков, создайте новый только для сетевых частей вашего приложения или создайте для него выделенный поток.

Помимо этого, вам трудно чем-то помочь, не видя больше кода.

...