Ускорение проблем Asio, Сервер-Клиент, Медленно в реальной сети? - PullRequest
0 голосов
/ 07 сентября 2010

Я создал клиент-серверную архитектуру, используя Boost Asio.

Всё работает, я могу отправлять и получать сообщения и т. Д., Поэтому нет сомнений в правильности. Однако, когда я внедряю его в реальную сеть, он вдруг становится ОЧЕНЬ медленным. Когда я запускаю сервер и клиент на одном компьютере, он работает невероятно быстро, но когда я запускаю его на 2 разных компьютерах, он становится чрезвычайно медленным, мне приходится ждать секунду для каждого сообщения. И эти сообщения МАЛЫЕ, может быть, 50, максимум 60 символов. Они отправлены правильно, хотя.

Код:

stream = new tcp::iostream(serverIp, portNum); // Clientside

Для отправки и получения я использую:

(*stream) << data << delimiter;
std::getline(*stream, response, '#');

Сервер использует то же самое для отправки и получения, а также некоторый код настройки для настройки соединения:

boost::asio::io_service io_service;

tcp::endpoint endpoint(tcp::v4(), portNum); 
tcp::acceptor acceptor(io_service, endpoint);

for (;;)
{
    tcp::iostream *stream = new tcp::iostream();
    acceptor.accept(*(stream->rdbuf()));

    // Do stuff with the stream
}

Опять же, это работает, просто очень медленно, внезапно в реальной сети. Есть ли что-то, что я делаю не так? Я попытался изменить portNum, не работает. Что еще я могу сделать?

Ответы [ 3 ]

2 голосов
/ 07 сентября 2010

Если это общая сумма вашего кода отправки / получения, то, похоже, много времени будет потрачено на ожидание синхронизации отправителя и получателя до завершения вызовов << и getline. Этот эффект будет значительно усилен, когда будет введено реальное сетевое соединение. Это может показаться быстрым локально, но измерять пропускную способность байтов локально, прежде чем предполагать это. Как правило, вы не будете тесно связывать обработку отправки и получения таким образом - вы в основном берете библиотеку асинхронного ввода-вывода и заставляете ее синхронизироваться. Попробуйте переделать, чтобы фактически использовать асинхронный ввод-вывод и отделить обработку отправки и получения друг от друга (или, по крайней мере, не сериализовать их таким образом, используя синхронные вызовы ввода-вывода более высокого уровня для доступа к сокету), и производительность в сети должна улучшиться . </p>

0 голосов
/ 11 сентября 2010

Возможно, это не исправлено, но стоит попробовать - измените клиент для очистки потока после отправки сообщения:

  (*stream) << data << delimiter << std::flush;
0 голосов
/ 07 сентября 2010

Подготовьте данные для отправки в автономном режиме, затем используйте async_write для записи данных. Считайте данные с носка с помощью async_read. Это неблокирующие операции, поэтому они могут оказать значительное влияние на серверную часть.

...