gpt4 book ai didi

c++ - wpa_supplicant C API 未定义行为

转载 作者:行者123 更新时间:2023-11-28 05:27:17 25 4
gpt4 key购买 nike

我设法让 wpa_supplicant C API 工作。但是每次我重新启动我的程序时它的行为都完全不同。

每次都连接成功。但随后麻烦开始了:

有时 SCAN 回复空字符串但返回 0 (Ok)。在另一次运行中,它回复 "OK\n" 并返回 0。当我循环并等待返回 0 和 "OK\n"-回复时,它会永远运行回复为空,返回 0。

在极少数情况下,SCAN 返回 0 并回复 "OK\n" 我继续等待 SCAN_RESULTS 返回 0。在这一点它表现得完全随机。有时它会回复整个扫描结果。有时它只回复 0 并且扫描结果在我的事件管道中。或者像在大多数情况下一样:它返回 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;
}

最佳答案

尝试在代码中的适当位置做类似的事情

    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,因为我怀疑您真的不需要回调例程。但如果你愿意,可以放一个。

关于c++ - wpa_supplicant C API 未定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40286263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com