Работая над сетевой библиотекой, я недавно заметил, что наличие подвески к basic_streambuf :: in_avail в сочетании с функцией writeome было бы очень удобно для асинхронного ввода-вывода.
Я искал в Интернете и проверил несколько ссылок C ++, если есть какая-либо функция, которая отвечает этим требованиям, но, похоже, мне не повезло. Единственный источник, который упоминает подобную функциональность Boost’s Asio библиотека, однако в описании четко говорится, что вызов функции будет блокироваться до тех пор, пока не будет отправлен хотя бы один байт, что не отражает мое желаемое поведение.
Чтобы уточнить мой вопрос, я создал черновик, основанный на публикации C ++ N3337.
27.6.3.2.5 Место размещения [streambuf.pub.put]
streamsize in_depart();
Возвращает: Если позиция записи доступна, возвращает
epptr() - pptr()
, Иначе
возвращаетсяshowmanycp()
,27.6.3.4.5 Место размещения [streambuf.virt.put]
streamsize showmanycp();
Возвращает: Оценка количества символов, которые можно записать в последовательность,
или же-1
, Если он возвращает положительное значение, то последовательные вызовыoverflow()
не буду
вернутьtraits::eof()
пока по крайней мере это количество символов не будет записано в
поток. Еслиshowmanycp()
возвращается-1
затем звонитoverflow()
не удастся.Поведение по умолчанию: Возвращает ноль.
Примечания: Пользы
traits::eof()
,27.7.3.7 Неформатированные выходные функции [ostream.unformatted]
streamsize writesome(char_type* s, streamsize n);
Последствия: Ведет себя как неотформатированная функция вывода (как описано в пункте 27.7.3.7.
1). После постройки сторожевого объекта, если!good()
звонкиsetstate(failbit)
который может
бросить исключение и вернуть. В противном случае пишетn
символы, обозначенныеs
, Если
rdbuf()->in_depart() == -1
, звонкиsetstate(badbit)
(который может бросить
ios_base::failure
(27.5.5.4)) и не пишет символов;— Если
rdbuf()->in_depart() == 0
, пишет без символов.— Если
rdbuf()->in_depart() > 0
пишетmin(rdbuf()->in_depart(), n))
персонажи.Возвращает: Количество написанных символов.
Я предполагаю, что вы неверно истолковали значение in_avail()
а также readsome()
: все это говорит о том, что поток прочитал блок данных и в буфере все еще есть символы. Да, теоретически это может сделать что-то другое, но, в частности, при чтении из сети вы не знаете, сколько данных доступно, пока не попробуете их прочитать.
Точно так же нет способа гарантировать возможность избавиться от определенного количества символов: что бы out.writesome(buf, n)
имею в виду? Если вы хотите, чтобы это означало, что вы бросили n
персонажи в out
буфер, вы можете просто создать подходящий буфер потока и использовать write()
, Гарантируя, что n
байты отправляются с блокировкой, однако не могут быть выполнены (по крайней мере, для 1 < n
). Я думаю, что вы хотите последнее, хотя.
Других решений пока нет …