Как правильно использовать boost :: asio? (TCP-сервер) - PullRequest
1 голос
/ 18 марта 2012

В настоящее время я пытаюсь создать серверную программу, которая отвечает на зашифрованные по протоколу SSL TCP-пакеты, поступающие от нескольких клиентов.

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

Поэтому я решил поискать какой-нибудь API, который бы помог мне с сокетами (я имею в виду, зачем все заново изобретать)?) и я наткнулся на boost :: asio.Он звучал многообещающе, так как имел поддержку SSL и обещал быть очень эффективным по сравнению со всеми этими потоками.

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

Вот как это работает в настоящее время:

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

  • Я проверяюдля новых клиентов, принимающих и возвращающих сокет, так что я знаю, где ответить на

  • , а затем, как только приходит пакет, я сначала читаю заголовок с помощью SSL_read (...) (потому что егоSSL зашифрован), чтобы определить размер пакета, а затем снова использовать SSL_read, чтобы сохранить данные в буфере и вернуть данные

  • , как только это будет сделано, я читаю данные и что-то делаю в зависимости отчто в нем, а затем создать новый пакет, который я отправляю пакет клиенту с SSL_write

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

И теперь я не уверен, как это реализовать с помощью boost :: asio (или, если вообще возможно).Я уже рассмотрел некоторые примеры, но не смог извлечь из этого многого.

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

...