Методологии для работы с несколькими клиентами в C ++ winsock

Я разрабатываю одноранговое приложение для анализа сообщений. Таким образом, одному пиру может понадобиться справиться со многими клиентами. А также есть возможность отправлять и получать большие данные (~ 20 МБ данных в одном сообщении). Могут быть ситуации, когда многие узлы отправляют большие данные одному и тому же узлу. Я слышал, что есть много решений, чтобы справиться с такой ситуацией.

  • Использовать нить на пира
  • Используя цикл, чтобы пройти через пиров и если есть данные, мы можем
    Получать
  • С помощью select функция
  • и т.п.

Какова наиболее подходящая методология или наиболее распространенный и общепринятый способ справиться с подобной ситуацией? Любые советы или подсказки приветствуются.

обновленный: Есть ли хороший пиринговый библиотека распределенных вычислений или платформа для C ++ на платформе Windows

3

Решение

Не используйте поток для сверстника; Помимо числа процессоров, дополнительные потоки могут только снизить производительность. Вы также должны были настроить dwStackSize так что 1000 бездействующих одноранговых узлов не будут стоить вам 1000 МБ оперативной памяти.

Вы можете использовать пул потоков (X обработка потоков Y сокеты), чтобы получить повышение производительности (или, в идеале, порты завершения ввода-вывода), но это имеет тенденцию работать невероятно хорошо для определенных типов приложений, а вовсе не для других типов приложений. Если вы не уверены, что ваш подходит для этого, я не оправдываю риск.

Вполне допустимо использовать один поток и опрашивать / отправлять из большого количества сокетов. Не знаю точно когда large будет иметь значительные накладные расходы, но я бы (консервативно) приблизить его где-то между 2k-5k разъемов (на оборудовании ниже среднего).


Обходной путь для WSAEWOULDBLOCK это иметь std::queue<BYTE> байтов (не очередь «пакетных объектов») для каждого сокета в вашем приложении (вы заполняете это queue с данными, которые вы хотите отправить), и иметь один фоновый поток, единственная цель которого состоит в том, чтобы сливать очереди в соответствующий сокет send (X байт за раз); Вы можете использовать блокирующий сокет для этого сейчас (так как это фоновый рабочий), но если вы используете неблокирующий сокет и получите WSAEWOULDBLOCK вы можете просто продолжать пытаться опустошить очередь (здесь это не будет мешать работе вашего приложения).

2

Другие решения

Вы могли бы использовать libtorrent.org который построен на вершине наддува (boost-asio). Основное внимание уделяется эффективности и масштабируемости.

У меня не так много опыта разработки сокетов в C ++, но в C # у меня был действительно хороший опыт асинхронного принятия соединений и передачи их в собственный поток из пула потоков.

0

По вопросам рекламы [email protected]