C++代码来查找BSSID OF 关联网络



可能的重复项:
想知道通过 UBUNTU 中的C++无线网络的 ESSID

您好,我编写了以下代码,它是项目的一部分。它用于查找当前关联网络的 ESSID。但它有一个缺陷,它也显示与我没有关联的网络的 ESSID,即如果我尝试将自己与无线 n/w 关联并且不成功,即没有收到 DHCP 报价,那么它也将显示我尝试过的 ESSID

是否可以找到当前关联无线网络的BSSID,因为这是我标记黑白关联和非关联的唯一方法,例如使用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 : %sn",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;
}

注意:由于这个问题似乎在两个地方重复,所以我在这里也重复我的答案。

您没有提到您是否使用独立的基本服务集(即没有控制接入点的点对点网络),因此,如果您不尝试创建点对点网络,那么BSSID应该是本地接入点的MAC地址。可用于访问该信息ioctl()常量是 SIOCGIWAP 。ioctl 有效负载信息将存储在您的iwreq结构中,地址为 u.ap_addr.sa_data

相关内容

  • 没有找到相关文章

最新更新