2011-05-13 2 views
0

가능한 중복 : C++ 코드는 관련 네트워크의 BSSID를 찾을 수


Want to know the ESSID of wireless network via C++ in UBUNTU

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

현재 연결된 무선 네트워크의 BSSID를 찾을 수 있습니까? 예를 들어, 연결된/연결되어 있지 않은 b/w를 표시 할 수있는 유일한 방법입니다. ioctl 호출과 함께?

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

    CStdString result = "None"; 

    int sockfd; 
    char * id; 
    char ESSID[20]; 
    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

참고 :이 질문은 두 곳에서 중복 될 것으로 보인다 이후, 나뿐만 아니라 여기에 내 대답을 반복하고있다.

독립적 인 기본 서비스 세트 (예 : 제어 액세스 포인트가없는 ad-hoc 네트워크)를 사용하는지 여부는 언급하지 않았으므로 ad-hoc 네트워크를 만들지 않으려는 경우 , BSSID는 로컬 액세스 포인트의 MAC 주소 여야합니다. 해당 정보에 액세스하는 데 사용할 수있는 ioctl() 상수는 SIOCGIWAP입니다. ioctl 페이로드 정보는 iwreq 구조 내부에 u.ap_addr.sa_data에 저장됩니다.

관련 문제