А как же я .. Сбросить "используемый адрес" ?
Мне нравится делать ЛИФО , так что вот небольшое дополнение.
Мне нужно убедиться, что "адрес", о котором идет речь, является либо удаленным адресом устройства 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
Подсказка: если вы хотите ответить на комментарий Ричардса, вам следует использовать кнопку [ответить] в верхней части комментария. Это известит его о вашем ответе. В противном случае единственный способ для него заметить ваш ответ-это вернуться к этой теме без всякой причины...