В сокете домена UNIX (тип AF_UNIX и DGRAM), когда читатель медленный, нет. пакетов в очереди равно 'max_dgram_qlen' . Есть ли способ определить байты, занятые в очереди (или) нет. большего количества свободных байтов в очереди либо на стороне отправителя, либо на стороне получателя. Или, по крайней мере, писатель блокируется, когда очередь заполнена. Есть ли способ идентифицировать событие блока записи? Заранее спасибо.
Сведения об очереди сокетов домена Unix
comment
к вашему сведению... AF_INET+SOCK_DGRAM - это не сокет домена Unix, это сокет TCP/IP, использующий UDP.
- person selbie   schedule 18.10.2016
comment
Возможный дубликат: stackoverflow.com/questions/16427842/ . Но я думаю, вы спрашиваете, сколько байтов стоит в очереди на стороне отправителя.
- person selbie   schedule 18.10.2016
comment
Я отредактировал вопрос. И спасибо за ваше предложение.
- person Chandira Mouli   schedule 18.10.2016
Ответы (2)
Вы должны установить свой файловый дескриптор как неблокирующий и использовать select
, чтобы определить, можно ли в него записывать в текущий момент времени.
person
xaxxon
schedule
18.10.2016
- Вы можете использовать ioctl, чтобы узнать.
Чтобы проверить буфер записи, если он пуст (при условии, что вы уже поместили туда данные и хотите проверить, были ли они использованы):
ioctl(fd, SIOCOUTQ, &pending);
Где fd — файловый дескриптор сокета, а в ожидании переменной будет возвращен оставшийся размер данных.
Чтобы проверить буфер чтения, если он пуст (при условии, что кто-то уже поместил туда данные, и вы хотите проверить, есть ли они, не потребляя их):
ioctl(fd, SIOCINQ, &pending);
/*note the difference on the second parameter, where we change the flag from SIOCOUTQ to SIOCINQ*/
- Основываясь на сообщении об ошибке, возвращаемом функцией send(), мы можем идентифицировать событие переполнения буфера. Проверив error==ENOBUFS, вы можете идентифицировать переполнение буфера.
person
Chandira Mouli
schedule
19.10.2016
2 неправильно. Это относится к буферу устройства, а не к буферу сокета. ENOBUFS: Очередь вывода для сетевого интерфейса заполнена. Обычно это указывает на то, что интерфейс прекратил отправку, но может быть вызван временной перегрузкой. (Обычно в Linux этого не происходит. Пакеты просто молча отбрасываются, когда очередь устройства переполняется.)
- person sourcejedi; 25.01.2018