2016-10-27 19 views
0

私はwpa_supplicant C APIを動作させることができました。しかし、私はプログラムを再起動するたびに完全に異なる動作をします。wpa_supplicant C APIの定義されていない動作

接続は毎回成功します。しかし、問題が始まる:

ときどきSCANは空の文字列を返しますが、0(OK)を返します。 別の実行では、"OK\n"と応答し、0を返します。返り値が0で、返り値が"OK\n"のとき、それは空の応答と0の戻り値で永久に実行されます。

まれに、SCANが0を返し、"OK\n"と返信すると、私は移動し、SCAN_RESULTSが0を返すのを待ちます。この時点で、それは完全にランダムに動作します。場合によってはスキャン結果全体に返答することもあります。場合によっては返信が0になり、スキャン結果がイベントパイプラインに含まれます。 ほとんどの場合と同様に、0を返しますが何もしません。返信なし、イベントなし。何もない。

私はコードをこのスニペットに縮小し、何が間違っているのか調べようとしました。私は、すべてを試してみました。私は、ワークフローやヒントを定義していないctrl-interfaceのドキュメンテーションにいくらか不満を持っています。 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

私は 'rply'が初期化されていないことに注意してください。あなたは 'malloc'(または' new char [ENOUGHSPACE] ')が必要か、' char rply [ENOUGHSPACE] 'を明示的に宣言する必要があると思います。 – infixed

+0

@infixedはい。私はwpa_ctrl_requestがmallocを実行すると思った。私はこれを修正した。何も変わっていません。 –

+0

C++を使用している間、C APIのように見えます。明らかに、バッファに答えを入れることと、バッファサイズを取得し、実際の出力サイズを戻す変数が必要です。私の答えのようなコードを試してください – infixed

答えて

1

私はあなたが本当にコールバック・ルーチンを必要としない疑いがあるため、

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つを入れてください。

+0

ああ、私の神、この単純な割り当ては 'rplylen'へのトリックでした。私はちょっと愚か/恥ずかしいが、同時に幸せに感じる。どうもありがとう! –

関連する問題