用于查找BSSID OF关联网络的C ++代码

时间:2011-05-13 13:18:20

标签: c++ wireless ubuntu-10.10

  

可能重复:
  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;
}

1 个答案:

答案 0 :(得分:0)

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

您没有提到您是否使用了独立的基本服务集(即没有控制访问点的ad-hoc网络),因此如果您不想创建ad-hoc网络,那么BSSID应该是本地接入点的MAC地址。您可以用来访问该信息的ioctl()常量为SIOCGIWAP。 ioctl有效负载信息将存储在iwreq的{​​{1}}结构内。