Linux предоставляет SIOCOUTQ
ioctl () для запроса количества данных в выходном буфере TCP:
http://www.kernel.org/doc/man-pages/online/pages/man7/tcp.7.html
Вы можете использовать это, плюс значение SO_SNDBUF
, чтобы определить, достаточно ли в исходящем буфере места для какого-либо конкретного сообщения.Строго говоря, ответ на ваш вопрос «да».
Но с этим подходом есть две проблемы.Во-первых, это специфично для Linux.Во-вторых, что вы планируете делать, когда недостаточно места для отправки всего вашего сообщения?Цикл и снова позвоните select
?Но это просто скажет вам, что сокет снова готов к записи, что приведет к циклу занятости.
В целях эффективности вам, вероятно, следует прикусить пулю и просто заняться частичной записью;позвольте сетевому стеку беспокоиться о разбиении вашего потока на пакеты для оптимальной пропускной способности.