Я создал клиент-серверную программу, клиент запускает экземпляр класса Writer, а сервер запускает экземпляр класса Reader.Затем Writer будет асинхронно записывать байты данных DATA_SIZE в устройство чтения каждые миллионы секунд USLEEP.
Каждый последующий запрос Writer async_write выполняется только в том случае, если был вызван обработчик «on write» из предыдущего запроса.
Проблема в том, что если Writer (клиент) записывает в сокет больше данных, чем Reader (сервер) способен принять, это выглядит следующим образом:
Writer начнет запись в (я думаю) системный буфер и, хотя Reader еще не получил данные, он вызовет обработчик «on write» без ошибки.
Когда буфер заполнен, boost :: asio больше не будет запускать обработчик «при записи», пока буфер не станет меньше.
Между тем, Reader все еще получаетнебольшие порции данных.
Тот факт, что Reader продолжает получать байты после закрытия программы Writer, похоже, подтверждает правильность этой теории.
Мне нужно предотвратить эту буферизацию, потому что данные должны быть «в реальном времени» (насколько это возможно).
Я предполагаю, что мне нужно использовать некоторыекомбинация опций сокетов, предлагаемых asio, таких как no_delay или send_buffer_size, но я просто догадываюсь здесь, так как я не смог успешно поэкспериментировать с ними.
Я думаю, что первое решение, о котором можно подуматьэто использовать UDP вместо TCP.Это будет , так как в ближайшем будущем мне нужно будет переключиться на UDP и по другим причинам, но сначала я хотел бы узнать, как это сделать с TCP только ради того, чтобыЭто прямо в моей голове, на случай, если у меня возникнет подобная проблема в будущем.
NOTE1 : Прежде чем я начал экспериментировать с асинхронными операциями в библиотеке asio, я реализовал эту же самуюсценарий, использующий потоки, блокировки и asio :: сокеты и не испытавший такой буферизации в то время.Мне пришлось переключиться на асинхронный API, потому что asio, по-видимому, не позволяет прерывать синхронные вызовы по времени.
NOTE2 : Вот рабочий пример, демонстрирующий проблему: http://pastie.org/3122025
EDIT : я сделал еще один тест, в моем NOTE1 я упоминал, что когда я использовал asio :: iosockets, у меня не было этой буферизации.Поэтому я хотел быть уверенным и создал этот тест: http://pastie.org/3125452 Оказывается, Буферизация есть событие с asio :: iosockets , поэтому должно было быть что-то еще, что заставило его пойтиплавно, возможно ниже FPS.