Ищем самый простой (и самый быстрый) пример программирования сокетов TCP для Windows, C или C ++ - PullRequest
4 голосов
/ 20 октября 2010

Я ищу самый простой (и самый быстрый) пример программирования сокетов TCP для Windows, C или C ++, в зависимости от того, что может быть достигнуто быстрее, отправка данных trival, например, 1 байт или несколько байт, но в одном пакете,Это для исследовательских целей.Я гуглил и нашел несколько примеров, однако каждый из них выглядит немного по-другому, некоторые в C, некоторые в C ++, некоторые используют ZeroMemory (из окон), некоторые используют memset, некоторые присваивают данные по-разному, поэтомухотя я могу найти примеры winsock в c / c ++ и хотя я не являюсь экспертом в программировании сокетов - я не уверен, что такое абсолютно минималистичный код на c / c ++, чтобы добиться его максимально быстрым способом.

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

Полагаю, я мог бы попробовать каждый из них и рассчитать время,но мне было интересно, если бы у какого-нибудь эксперта по сокетам / winsock был бы супер простой сервер / клиент на C / C ++ с некоторой функцией синхронизации (высокое разрешение) в конце.Я говорю супер просто, потому что я пытаюсь определить, насколько быстро (и самый быстрый способ) может передавать сокеты на моих машинах, конечно, это может включать в себя отключение алгоритма Нейгла, что я в любом случае хотел бы сделать.Я не уверен, какие другие уловки люди используют.

Спасибо.

Ответы [ 8 ]

2 голосов
/ 20 октября 2010

Попробуйте каркас сервера сокетов Лена Холгейта . Я полагаю, что он коммерциализировал это в упакованной версии, но это должно быть хорошим местом для начала. Включено руководство по реализации клиента. Это не самый простой код, но если вы заинтересованы в максимизации производительности, простой код может не соответствовать вашим потребностям.

Вам придется добавить собственную поддержку синхронизации, но это, вероятно, верно для любого возможного готового пакета.

1 голос
/ 20 октября 2010

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

Открытый исходный код:

  1. OpenDDS - на основе протокола DDS (очень высокая производительность - используется в таких вещах, как подводная лодка, системы управления кораблем и т. Д.). Их реализация немного медленнее, чем в режиме raw boost :: asio, однако для простоты использования и наворотов трудно победить.
  2. ZeroMQ - аналогично DDS, но на основе протокола MQ, опять-таки очень быстро (миллионы сообщений / сек), MQ установлен, но ZeroMQ еще не существует.
  3. AMQP - Я полагаю, что в этом месте вы сможете найти что-то от Red Hat, опять же очень быстро и с новым протоколом.

Коммерческая:

  1. Tibco RV: трудно победить, кроме продавцов оборудования
  2. 29West - аппаратное обеспечение (и программное обеспечение - думал, что я никогда не играл с ним лично)
  3. Утешение - оборудование
  4. Тервелла - аппаратное обеспечение

Последние три предполагают, что у вас есть несколько миллионов долларов! ;)

1 голос
/ 20 октября 2010

Самые минимальные примеры, которые мне известны, приведены в Руководство Биджа .

1 голос
/ 20 октября 2010

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

edit: я знаю, что это не готовый клиент / сервер, а именно то, что вы ищете, но Asio позволяет чрезвычайно легко получить то, что вы хотите, из нескольких строк кода.

0 голосов
/ 10 ноября 2017

ucspi-tcp

Олди, но вкуснятина, написанная на C, qmail широко используется почтовый сервер на его основе.

https://cr.yp.to/ucspi-tcp.html

0 голосов
/ 23 марта 2011

Вы можете проверить Push Framework .

0 голосов
/ 20 октября 2010

Перед написанием третьего комментария я собираю их в ответе

0 голосов
/ 20 октября 2010

Я только что реализовал сетевое решение, используя сокет ++ , и оно работает довольно хорошо. Я считаю, что это основа для boost asio, поэтому, если вы не хотите устанавливать все boost, вы можете проверить это.

Смысл библиотеки в том, что вы можете использовать поток с вашим сокетом, отправляя данные, как если бы вы использовали std :: cout или std :: cerr.

РЕДАКТИРОВАТЬ: если вы используете более поздние версии Windows, то для компиляции этой библиотеке потребуется некоторая настройка (она отлично работает как есть для XP, но, очевидно, некоторый сетевой код был перемещен для win vista и 7).

...