2011-05-13 2 views
0

가능한 중복 :
Want to know the ESSID of wireless network via C++ in UBUNTUC++ 코드는 관련 네트워크의 BSSID를 찾을 수

안녕하세요

내가 프로젝트의 일부인 다음 코드를 작성했습니다. 현재 연결된 네트워크의 ESSID를 찾는 데 사용됩니다. 그러나 그것은 또한 내가 연결된 무선 네트워크의 ESSID를 표시하는 결점이 있습니다. 즉, 무선 N/W에 자신을 연결하려고 시도하고 그것이 성공하지 못하면 DHCP가 수신되지 않습니다. 내 시도를 한 ESSID를 표시하십시오.

가능한 경우 현재 연결된 무선 네트워크의 BSSID를 찾기 위해 ioctl 호출을 시도해보십시오. n/w는 연결된/표시되지 않은 W/W를 표시 할 수있는 유일한 방법입니다.

CODE :

int main (void) 
{ 
    int errno; 
    struct iwreq wreq; 

    CStdString result = "None"; 

    int sockfd; 
    char * id; 
    char ESSID[100]; 
    memset(&wreq, 0, sizeof(struct iwreq)); 

    if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
     fprintf(stderr, "Cannot open socket \n"); 
     fprintf(stderr, "errno = %d \n", errno); 
     fprintf(stderr, "Error description is : %s\n",strerror(errno)); 
     return result ; 
    } 
    CLog::Log(LOGINFO,"Socket opened successfully"); 

    FILE* fp = fopen("/proc/net/dev", "r"); 
    if (!fp) 
    { 
     // TBD: Error 
     return result; 
    } 

    char* line = NULL; 
    size_t linel = 0; 
    int n; 
    char* p; 
    int linenum = 0; 
    while (getdelim(&line, &linel, '\n', fp) > 0) 
    { 
     // skip first two lines 
     if (linenum++ < 2) 
      continue; 

     p = line; 
     while (isspace(*p)) 
     ++p; 

     n = strcspn(p, ": \t"); 
     p[n] = 0; 

     strcpy(wreq.ifr_name, p); 

     id = new char[IW_ESSID_MAX_SIZE+100]; 
     wreq.u.essid.pointer = id; 
     wreq.u.essid.length = 100; 
     if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) { 
      continue; 
     } 
     else 
     { 
      strcpy(ESSID,id); 
      return ESSID; 
     } 
     free(id); 
    } 

    free(line); 
    fclose(fp); 
    return result; 
} 
+0

http://www.cryer.co.uk/glossary/s/ssid.htm에 따르면 ESSID와 BSSID의 차이는 ESSID가 액세스 포인트가있는 무선 네트워크에 적용되고 BSSID가 ad-hoc 무선에 적용된다는 것입니다 회로망. 나는 C++을 통해 SSID를 찾는 것이 동일한 코드를 사용하는 것을 상상한다. 그러나 API 호출 중 일부는 다른 플래그를 사용한다. 그럼에도 불구하고 삭제 된 답변을 사용하면 복제중인 게시물을 알고 있다는 것을 분명히 알 수 있지만 폐쇄되지 않도록 회신에서 명시 적으로 참조해야합니다. 그리고 아마도 현상금도 도움이 될 것입니다. – Brian

답변

0

당신은 당신이 아니에요, 그래서 만약 당신이 (즉, 아니 제어 액세스 포인트와 애드혹 네트워크) 설정 독립적 인 기본 서비스를 사용하거나되지 않은 여부를 언급하지 않았다 ad-hoc 네트워크를 만들려고하면 BSSID는 로컬 액세스 지점의 MAC 주소 여야합니다. 해당 정보에 액세스하는 데 사용할 수있는 ioctl() 상수는 SIOCGIWAP입니다. iwreq 구조체 내에 ioctl 페이로드 정보가 저장됩니다 (u.ap_addr.sa_data).

+0

하지만 여기에 SIOCGIWAP을 사용하면 연결을 만들기 위해 ATTEMPTED를 지속 한 네트워크의 BSSID가 표시됩니다. 일부 iw_ether_cmp를 사용하여 iwconfig 라이브러리를 사용하여 완전히 이해할 수 없습니다. 누군가가 나를 도울 수 있기를 바랍니다. – Alan