#c #boost #tcp
#c #boost #tcp
Вопрос:
Моя ситуация: я хотел бы создать хобби-проект для улучшения моего C , включающий программирование в реальном времени / с задержкой.
Я решил, что напишу небольшую Java-программу, которая будет отправлять клиенту множество случайных цен на акции, где клиент будет написан на C и примет все цены.
Я не хочу, чтобы клиенту C приходилось опрашивать / иметь цикл while, который непрерывно проверяет наличие данных, даже если их нет.
Какие варианты у меня есть для этого? Если это проще сделать с сервером C , то это не проблема.
Я полагаю, для начала мне придется использовать пакет boost ASIO для работы в сети?
Я буду делать это в Windows 7.
Комментарии:
1. Я предположил, что вы захотите использовать HTTP, потому что он прост в использовании, может проходить через сети, через брандмауэры, прокси и т. Д. Это то, что вы хотите? Если вы предполагаете простую сеть с прямым подключением, возможны другие решения.
2. Честно говоря, смысл этого проекта в том, чтобы восстановить мой C с нуля, потренировать некоторое ускорение, а затем, в-третьих, возможно, сделать мой код быстрым для приема соединений. Знаете ли вы, как будут передаваться реальные высокочастотные платформы, будет ли это HTTP? Если нет, то определенно нет смысла в HTTP.
3. Если вы говорите о машинно-аппаратных запасах, я ожидаю, что они будут использовать двоичный протокол через сокет TCP. например, отправка форматированного сообщения, возможно, фиксированного размера, которое может быть структурой. Клиент откроет соединение с сервером, возможно, отправит начальное сообщение с описанием интересующих данных, а затем отправит поток или опрос ввода-вывода, считывающий ответы.
4. HFT вполне может избежать TCP в пользу UDP. Торговля старыми данными хуже, чем отсутствие торговли вообще, поэтому повторная отправка — не лучшая стратегия восстановления потерянных пакетов. И это определенно исключает HTTP.
5. @MSalters Конечно, для абсолютной скорости UDP было бы лучше, если бы вы не заботились о возможной потере данных. Даже тогда вы можете использовать свои собственные порядковые номера для пакетов и иметь отдельное, более медленное, но надежное соединение для заполнения недостающих данных, если вам это нужно.
Ответ №1:
Почему бы просто не заставить сервер Java принимать соединения, а затем подождать некоторое время. например, 10 секунд. В течение этого времени, если данные станут доступны, отправьте их и закройте соединение.
Тогда у клиента C может быть поток, который открывает соединение всякий раз, когда завершается предыдущее.
Это должно давать довольно низкую задержку без очень частого создания соединений при отсутствии новых данных.
По сути, это модель веб-программирования Comet, которая используется для многих приложений.
Комментарии:
1. Я немного не уверен, почему сервер будет принимать подключения, когда я думал, что сервер будет диктовать, когда требуются подключения?
2. По сути, HTTP управляется клиентом, так что это один из способов позволить серверу отвечать в определенное время, практически всегда имея открытое, но ожидающее соединение.
3. Какой пример повышения был бы лучшим для подражания: чат или HTTP-сервер / клиент? boost.org/doc/libs/1_37_0/doc/html/boost_asio/examples.html
Ответ №2:
Подумайте о том, как веб-сервер получает данные. При обращении к URL-адресу данные передаются на сервер. Серверу не нужно опрашивать клиента (или действительно знать что-либо о клиенте, кроме его службы, передающей ему байты).
Вы могли бы использовать Java-сервлет для приема данных по протоколу HTTP и написания кода таким образом. Аналогично, в boost::asio есть пример сервера, который должен помочь вам начать. Под капотом вы могли бы включить постоянный HTTP, чтобы соединения не открывались / закрывались часто. Это значительно упростит модель кодирования.
Комментарии:
1. Привет, я должен уточнить, что я хотел принять данные на клиенте C . Я просто собирался написать Java-сервер для отправки тестовых данных. Это меняет ваше предложение? Или вы просто имели в виду использовать Java-сервлет для отправки данных клиенту C ?
2. Я полагаю, примерами boost, на которые вы мне указывали, были «HTTP-клиент» и «HTTP-сервер»?
3. То же самое относится и к клиенту, и к серверу. Локальный веб-сервер позволит вам подключиться таким же образом. Протокол HTTP, вероятно, не подходит для обратной связи в режиме реального времени, но он прост в использовании и не имеет проблем с брандмауэром 🙂 Примеры повышения, которые вы упомянули, — это то, о чем я говорю.
Ответ №3:
Я не хочу, чтобы клиент C должен был опрашивать / иметь цикл while, который непрерывно проверяет наличие данных
Кто-то ДОЛЖЕН это сделать.
Не обязательно быть вами. Я никогда не использовал boost ASIO, но он может обеспечить регистрацию обратного вызова. Если да, то просто зарегистрируйте вашу функцию обратного вызова с помощью boost, boost выполнит ожидание и перезвонит вам, когда получит некоторые данные.
Другой вариант, конечно, заключается в том, что вы используете некоторые синхронные функции. Например (не настоящая функция) Socket.read()
, которая блокирует поток до тех пор, пока в сокете не появятся данные или он не будет закрыт. Но в этом случае вы выделяете собственный поток.
—редактировать—
Отключите саму связь. Просто выберите любой механизм IPC (сокеты / каналы / файлы / …), Который, я думаю, кто-то уже описал. После отправки данных сами данные «кодируются» и «декодируются» вами, поэтому вы можете создать свой собственный протокол. Например. "%%<STOCK_NAME>=<STOCK_PRICE>##"
где «%%», =
и ##
(маркеры для обозначения начала, середины и конца), которые вы добавляете на стороне отправителя и удаляете на стороне получателя, чтобыполучить название акции и цену.
Вы можете разработать протокол дальше, исходя из ваших потребностей. Например, вы также можете отправлять рекомендации по покупке / продаже или текстовые сообщения с основными биржевыми новостями. Пока ваш клиент и сервер понимают, как «кодируются» данные, все в порядке.
Наконец, если вы хотите защитить связь (и говорите, что не используете какой-либо безопасный уровень (SSL)), вы можете зашифровать данные. Но это уже другая глава. 🙂
HTH
Комментарии:
1. Не могли бы вы подробно описать, что мне было бы лучше всего искать, если бы я искал в Google пример boost, состоящий из того, что вы описали в своем первом абзаце?