2014-01-20 5 views
0

사용 가능한 모든 무선 네트워크의 MAC 주소를 얻으려고합니다. netsh wlan show networks mode=bssid | findstr BSSIDnetsh wlan에서 MAC 주소를 가져 오는 정규식

내가 (사실 MAC은 개인 정보 보호를 위해 숨김) 얻을 출력 :

BSSID 1     : 2c:ab:25:xx:xx:xx 
BSSID 1     : 00:22:2d:xx:xx:xx 
BSSID 1     : c4:3d:c7:xx:xx:xx 
BSSID 1     : 00:27:22:xx:xx:xx 
BSSID 1     : 84:c9:b2:xx:xx:xx 
BSSID 1     : 00:25:5e:xx:xx:xx 
BSSID 1     : 00:06:5a:xx:xx:xx 
BSSID 2     : 00:06:5a:xx:xx:xx 
BSSID 1     : 00:06:5a:xx:xx:xx 
BSSID 2     : 00:06:5a:xx:xx:xx 
BSSID 1     : 00:06:5a:xx:xx:xx 
BSSID 2     : 00:06:5a:xx:xx:xx 
BSSID 1     : 00:06:5a:xx:xx:xx 
BSSID 2     : 00:06:5a:xx:xx:xx 
BSSID 3     : 00:25:5e:xx:xx:xx 
BSSID 4     : 00:25:5e:xx:xx:xx 
BSSID 5     : 00:25:5e:xx:xx:xx 
BSSID 1     : 00:27:22:xx:xx:xx 
BSSID 1     : 00:27:22:xx:xx:xx 
BSSID 1     : fc:b0:c4:xx:xx:xx 
BSSID 1     : fc:b0:c4:xx:xx:xx 

내가 출력 할 수있는 경우에만 MAC 정규식을 구현해야을

현재 사용하고 주소 (즉, 각 행의 마지막 17 자) C++의 배열에 MAC 주소를 저장해야합니다.

#include <iostream> 
#include <string> 
#include <stdio.h> // for _popen() and _pclose() 
using namespace std; 

    int main() 
    { 
     char buff[512]; 
     buff[0]=0; 
     string cmd="netsh wlan show networks mode=bssid | findstr BSSID"; 
     FILE *fpipe = _popen(cmd.c_str(),"rt"); 

     if(fpipe==NULL) 
      cout<<"Failed to open"<<endl; 
     else 
      cout<<"Opened pipe successfully"; 
     while(fgets(buff,sizeof(buff),fpipe)!=NULL){ 
      cout<<buff<<endl; 
     } 

     _pclose(fpipe); 
    } 

누군가가 나에게 배열에만 MAC 주소를 얻기 위해 부스트 정규식을 구현하기위한 코드를 제공 할 수 있습니다 :
 
내 현재 코드는 출력을 얻기 위해 다음과 같이인가? 제 의도는이 MAC 주소를 Google geo-locate API에 전달하고 위치를 얻는 것입니다.

아이디어가 있으십니까?

감사합니다.

답변

0

나는 마침내 그것을 작동시킬 수 있었다. 여기 내가 사용하는 코드는 다음과 같습니다 도와 준 모든 사람들에게

#include <iostream> 
#include <string> 
#include <stdio.h> // for _popen() and _pclose() 
#include <regex> 
#include <iterator> 

using namespace std; 

int main() 
{ 
    char buff[512]; 
    buff[0]=0; 
    string MacOutput; 

    string cmd="netsh wlan show networks mode=bssid | findstr BSSID"; 
    FILE *fpipe = _popen(cmd.c_str(),"rt"); 

    if(fpipe==NULL) 
     cout<<"Failed to open"<<endl; 

    while(fgets(buff,sizeof(buff),fpipe)!=NULL){ 
     string temp = string(buff); 
     MacOutput.append(temp); 
    } 
    _pclose(fpipe); 

    regex mac_regex("([0-9a-f]{2}[:-]){5}[0-9a-f]{2}"); 

    auto words_begin = 
     sregex_iterator(MacOutput.begin(), MacOutput.end(), mac_regex); 
    auto words_end = sregex_iterator(); 
    int j=0; 
    for (sregex_iterator i = words_begin; i != words_end; ++i) { 
     smatch match = *i;             
     string match_str = match.str(); //Can store the outputs in an array here! 
     cout << match_str << '\n'; 
    } 
} 

감사합니다! & 스 니펫 내가 stackoverflow 전역에서 사용했습니다!

0

당신은 "분할"이 사용 caracter :에서 문자열 (파일 C에 명령의 출력을 저장할 수 있습니다 가정 : \ 임시 \의 mac.txt를) 할 수

for /f "tokens=2,* delims=:" %%i in (c:\temp\mac.txt) do echo %%i:%%j 

또는 어쩌면 당신이 할 수있는 do (I cant this this)

for /f "tokens=2,* delims=:" %%i in ('netsh wlan show networks mode=bssid ^| findstr BSSID') do echo %%i:%%j 
+0

감사합니다 ...하지만 내 코드에서 파일을 사용할 수 없습니다. CPP를 사용하고 있습니다. 직접 netsh를 사용하면 작동하지 않습니다 ... – Tzar

+0

C++에서 정규 표현식을 사용할 수 없습니까? 왜 일괄 처리를하고 싶습니까 ?? –

+0

아직 CPP를 처음 사용합니다. Google의 geolocate API에 전달 될 이러한 MAC 주소의 배열을 만들려고합니다. 이것을 위해 cpp 코드 스 니펫을 사용할 수 있습니까? – Tzar

1

Ooh - Kayasax는 너무 가깝습니다! 문제는 출력에 선행 공간이 있다는 것입니다. ...

FOR /f "tokens=1*delims=:" %%a IN (c:\temp\mac.txt) DO (
FOR /f "tokens=*" %%c IN ("%%b") DO ECHO %%c) 

은이 공간을 제거해야합니다. Kayasax는이 작업을해야한다 제안하는 방식으로 파일 이름에 대한 netsh 명령을 대체

...

FOR /f "tokens=1*delims=:" %%a IN (
'netsh wlan show networks mode=bssid ^| findstr BSSID') DO (
FOR /f "tokens=*" %%c IN ("%%b") DO ECHO %%c) 

당신은 알고있다 -은 netsh가 ... Kayasax 옹호 것을 명령.

+0

고마워요 @ 마구 .. 그게 효과가. 하지만 여기서 문제는 C++로 구현하려고하는 것입니다. 파일을 사용할 수 없습니다. 다른 제안?파일 이름 대신 netsh를 사용하면 작동하지 않습니다. – Tzar

관련 문제