AF_UNSPEC на Redox: сокет можно разорвать вызовом, как в Linux

04.04.2026

В сетевом стеке Redox появилась константа AF_UNSPEC — способ отключить сокет обычным вызовом. Одновременно состояния сокета разделили явно: отключённый сокет перестал быть мутацией адреса, и починился getpeername.

Что делает AF_UNSPEC

В Linux сокет UDP можно отключить, передав в качестве адреса специальное значение AF_UNSPEC при вызове connect. Сокет остаётся открытым, но перестаёт быть связанным с адресом — после этого в него можно снова подключиться к другому адресу, то есть использовать для обмена с разными узлами по очереди.

Это не экзотика: так работают клиенты DNS, которые опрашивают несколько серверов по очереди, и многие приложения, переключающиеся между точками.

Что было не так

Специального значения в Redox не было, и отключить сокет штатным способом не получалось: адрес сокета менялся, а отдельного состояния «отключён» не существовало. Побочный эффект — неверная работа getpeername, который должен сообщать, что подключения нет.

Отсюда же следовало то, что заметили в марте: чтение адреса отправителя из сообщений UDP-сокета работало неочевидно, потому что адрес был единственным носителем состояния.

Как исправлено

Состояния сокета вынесены в отдельные варианты: «подключён», «не подключён», «отключён», плюс отдельное значение адреса без привязки к конкретному узлу. Из этого выросла и поддержка чтения IP-адреса отправителя из UDP-сообщений — адрес больше не приходится добывать отдельным вызовом.

Оригинал

Коммиты adding support for disconnecting via AF_UNSPEC от 4 апреля и Move to separate 0.0.0.0:0 and disconnected states for udp AF_UNSPEC от 10 апреля 2026 года в репозитории redox-os/relibc; сводка «This Month in Redox — April 2026», раздел «Networking Improvements»

Упоминаний: 1 · Просмотров: 3