Невозможно привязать сокет netlink() при настройке Android API 30.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Невозможно привязать сокет netlink() при настройке Android API 30.

Сообщение Anonymous »

Для создания сокета netlink я уже довольно давно использую следующее:

Код: Выделить всё

NetLinkLocalNetworkInfo::NetLinkSocket::NetLinkSocket() :
fd(0)
{
fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if(fd < 0)
{
throw std::runtime_error("Failed to create NetLink socket");
}

struct sockaddr_nl addr;
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;

int err = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
if(err < 0)
{
close(fd);
throw std::runtime_error("Failed to bind NetLink socket");
}
}
Это используется в части имеющейся у нас сетевой логики для автоматического прохождения NAT с использованием ICE. При ориентации на API 30 вызов привязки теперь возвращает -1, а errno — «Отказано в разрешении».
Изменение в поведении приложений, ориентированных на API 30, теперь означает, что вызов методаbind() является ограниченным. (Где-то на странице Google Developer есть документ, но будь я проклят, если смогу найти его снова. Раньше он жил здесь, но эта страница изменилась с тех пор, как я впервые столкнулся с этой проблемой несколько месяцев назад.) Предполагается, что это повлияет на все приложения, ориентированные на API 30, но я обнаружил, что это касается только приложений, ориентированных на API 30, и, работающих на устройстве (физическом или эмуляторе) под управлением Android 11. В моих заметках, когда я впервые столкнулся с этим, также упоминается статья, в которой предлагается использовать ConnectivityManager, но для этого потребуется либо придумать какой-то способ передачи информации в собственный код, либо вызвать вызов собственного кода в код платформы Android через JNI. Меня устраивает любой из этих вариантов, если это то, что должно произойти, но мне интересно, есть ли другая альтернатива, о которой я не знаю.
Я также видел этот похожий вопрос, но в одном из ответов есть ссылка, указывающая, что это должно быть возможно, по крайней мере, до API 30.
Теперь, когда нам не разрешено вызывать метод привязки(), какие еще варианты доступны?

Подробнее здесь: https://stackoverflow.com/questions/648 ... oid-api-30
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»