wpa_supplicant C API неопределенное поведение

Мне удалось заставить работать API C wpa_supplicant. Но он ведет себя совершенно по-разному каждый раз, когда я перезапускаю свою Программу.

Соединение успешно каждый раз. Но тогда начинаются неприятности:

Иногда SCAN отвечает пустой строкой, но возвращает 0 (ОК).
В другом прогоне он отвечает "OK\n" и возвращает 0. Когда я повторяю цикл и жду возврата 0 и "OK\n"-ответ, он работает вечно с пустым ответом и возвратом 0.

В редких случаях, когда SCAN возвращает 0 и отвечает "OK\n" Я иду дальше и жду SCAN_RESULTS вернуть 0. В этот момент он ведет себя совершенно случайно. Иногда он отвечает на все результаты сканирования. Иногда он ничего не отвечает, но возвращает 0, и результаты сканирования находятся в моем Event-Pipeline.
Или как в большинстве случаев: он возвращает 0, но ничего не делает. Нет ответа, нет событий. Ничего такого.

Для отладки я сократил свой код до этого фрагмента и попытался выяснить, что не так. Я сделал, попробовал все, и я несколько разочарован Документацией ctrl-интерфейса, которая не определяет какой-либо рабочий процесс или советы. Я устал от обратного инжиниринга wpa_cli.c, чтобы выяснить их поток.

Я должен добавить, что в основном первый PING работает хорошо. Любой другой PING приводит к пустым строкам.

/* some includes */

wpa_ctrl* _wpac;

static void callback(char* rply, size_t rplylen){
std::cout << std::string(rply,rplylen) << std::endl;
}

bool ScanResults() {
if(_wpac)
{
char rply[4096]; //same as in wpa_cli.c
size_t rplylen;
int retval = wpa_ctrl_request(_wpac,"SCAN_RESULTS",12,rply,&rplylen,callback);

if(retval == 0) {
std::string rplystring = std::string(rply,rplylen);
std::string message = std::string("wpa_ctrl(SCAN_RESULTS) replied: '").append(rplystring).append("' (").append(std::to_string(retval)).append(")");
std::cout << message << std::cout;
std::cout << std::string("wpa_ctrl(SCAN_RESULTS): Available (").append(std::to_string(retval)).append(")") << std::endl;
return true;
}
else
std::cout << std::string("wpa_ctrl(SCAN_RESULTS): Unavailable (").append(std::to_string(retval)).append(")") << std::endl;return false;
}
return false;
}

bool InitScan() {
if(_wpac)
{
char rply[4096]; //same as in wpa_cli.c
size_t rplylen;
int retval = wpa_ctrl_request(_wpac,"SCAN",4,rply,&rplylen,callback);
if(retval == 0) {
std::string rplystring = std::string(rply,rplylen);
std::string message = std::string("wpa_ctrl(SCAN) replied: '").append(rplystring).append("' (").append(std::to_string(retval)).append(")");
std::cout << message << std::endl;

if(rplystring == "OK\n") {
std::string message = std::string("wpa_ctrl(SCAN): Scan initiated (").append(std::to_string(retval)).append(")");
std::cout << message << std::endl;
return true;
}
}
std::string message = std::string("wpa_ctrl(SCAN) failed: (").append(std::to_string(retval)).append(")");
std::cout << message << std::endl;
}
return false;
}int main(){
std::string connection_string = std::string("/var/run/wpa_supplicant/").append(_interface);
wpa_ctrl* _wpac = wpa_ctrl_open(connection_string.c_str());
if(!_wpac)
return 1;

/* Well Working Attach to as Eventlistener omitted */

while(!InitScan())
sleep(1);
while(!ScanResults())
sleep(1)
return 0;
}

0

Решение

Попробуйте сделать что-то подобное в соответствующих местах в вашем коде

    char rply[4096];
size_t rplylen = sizeof(rply);
static char cmd[] = "SCAN";   //maybe a bit easier to deal with since you need a command length

int retval = wpa_ctrl_request(_wpac, cmd, sizeof(cmd)-1, rply, &rplylen, NULL);

NULL, потому что я подозреваю, что вам действительно не нужна процедура обратного вызова. Но вставьте один, если хотите.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]