Vaclav_ Ответов: 3

А как же я .. Сбросить "используемый адрес" ?


Мне нравится делать ЛИФО , так что вот небольшое дополнение.

Мне нужно убедиться, что "адрес", о котором идет речь, является либо удаленным адресом устройства BT, либо локальным адресом устройства BT.

Логически, поскольку он работает так, как ожидалось при первой чистой загрузке/ первоначальном запуске, это должен быть удаленный адрес - устройства bluetooth еще не взаимодействуют, следовательно, адрес локального устройства на самом деле недоступен. Только после "подключения".

Кстати, "повторное использование адреса" не подходит для AF_BLUETOOTH.


Я использую сокет для доступа к устройству bluetooth на локальном ПК .
Поскольку это (C++) незавершенная работа, я оставляю успешное соединение, не закрывая его.
При последующем повторном запуске кода возникает ошибка "адрес уже используется".
Что на самом деле хорошо для того, чтобы сделать код пуленепробиваемым, восстановившись после ошибки в коде.
Вопрос в том, как это сделать.

Мой пока рабочий код имеет только
выделите сокет - который все проходит нормально
привязать - привязать сокет к устройству Bluetooth - через-адрес - проходит ОК при первом запуске.

Так как же мне сбросить "адрес", если мой единственный рабочий код - "сокет(..."?
Другими словами, все, что у меня есть, - это выделенный сокет для работы.

Я не хочу переключаться на другое устройство BT - просто отпустите текущий адрес для повторного использования в коде.

Что я уже пробовал:

Закрытие сокета файловым дескриптором - не сработало.
Перезагрузка ПК работает, но это неприемлемый взлом.

KarstenK

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

Richard MacCutchan

Сокеты, как правило, остаются в течение определенного времени после того, как их создатель прекратил работу. Я думаю, что это около 9 минут. Документация Linux должна рассказать вам об этом.

Vaclav_

Ричард,
Я рассматриваю два варианта в
setsockopt(FileDescriptor_socket, SOL_SOCKET, SO_LINGER | SO_REUSEADDR,
(const char*) &lin, sizeof(int));

Похоже, что SO_LINGER работает при "завершении запущенной программы" - довольно расплывчато или непосредственно при обработке exit (). Не тестировать.
В самого себя-это специально, чтобы позволить bind (), чтобы повторно использовать адрес-то есть там, где "адрес уже используется" создается. Пока безрезультатно.
Этот человек специально заявляет "для AF_INET", поэтому я не уверен, что это сработает для AF_BLUTTOTH.
сокет(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

Stefan_Lang

Подсказка: если вы хотите ответить на комментарий Ричардса, вам следует использовать кнопку [ответить] в верхней части комментария. Это известит его о вашем ответе. В противном случае единственный способ для него заметить ваш ответ-это вернуться к этой теме без всякой причины...

3 Ответов

Рейтинг:
2

Dave Kreskowiak

Цитата:
Так как же мне сбросить "адрес", если мой единственный рабочий код - "сокет(..."?

Если ваш код не закрывает должным образом сокет, ваш единственный реальный вариант-перезагрузить машину.


Рейтинг:
0

Vaclav_

Это не решение проблемы, но
1. я устал щуриться, чтобы прочитать "комментарий"
2. Пока это выглядит как "проблема" заключалась в привязке сокета к неправильному "адресу"
Но мой код сломан, и мне нужно оправиться от этого (IDE quit big time), прежде чем я смогу вернуться к "исправлению" проблемы bind ().


Richard Deeming

Плохое зрение-это не повод оставлять комментарий в качестве "решения".

Если вы считаете, что размер шрифта комментариев слишком мал, и вы не хотите использовать инструменты "масштабирования" вашего браузера или расширение для переопределения CSS сайта[^], вы можете запросить увеличенный размер шрифта в Ошибки и предложения[^] форум.