Сведения об очереди сокетов домена Unix

В сокете домена UNIX (тип AF_UNIX и DGRAM), когда читатель медленный, нет. пакетов в очереди равно 'max_dgram_qlen' . Есть ли способ определить байты, занятые в очереди (или) нет. большего количества свободных байтов в очереди либо на стороне отправителя, либо на стороне получателя. Или, по крайней мере, писатель блокируется, когда очередь заполнена. Есть ли способ идентифицировать событие блока записи? Заранее спасибо.


person Chandira Mouli    schedule 18.10.2016    source источник
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

  1. Вы можете использовать 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*/
  1. Основываясь на сообщении об ошибке, возвращаемом функцией send(), мы можем идентифицировать событие переполнения буфера. Проверив error==ENOBUFS, вы можете идентифицировать переполнение буфера.
person Chandira Mouli    schedule 19.10.2016
comment
2 неправильно. Это относится к буферу устройства, а не к буферу сокета. ENOBUFS: Очередь вывода для сетевого интерфейса заполнена. Обычно это указывает на то, что интерфейс прекратил отправку, но может быть вызван временной перегрузкой. (Обычно в Linux этого не происходит. Пакеты просто молча отбрасываются, когда очередь устройства переполняется.) - person sourcejedi; 25.01.2018