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

C++ C++;用于查找关联网络的BSSID的代码,c++,wireless,ubuntu-10.10,C++,Wireless,Ubuntu 10.10,可能重复: 您好,我已经编写了以下代码,这是一个项目的一部分。用于查找当前关联网络的ESSID。但它有一个缺陷,即它还显示我未关联的网络的ESSID,即如果我尝试将自己与无线n/w关联,并且如果未成功,即未收到DHCP提供,则它还将显示我尝试使用的该ESSID 是否有可能找到当前关联无线网络的BSSID,因为这是我可以标记b/w关联和非关联的唯一方法,例如通过ioctl调用 int main (void) { int errno; struct iwreq wreq;

可能重复:

您好,我已经编写了以下代码,这是一个项目的一部分。用于查找当前关联网络的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;
}
int main(无效)
{
int errno;
结构iwreq;
CStdString result=“无”;
int-sockfd;
字符*id;
charessid[20];
memset(&wreq,0,sizeof(struct-iwreq));
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))=-1){
fprintf(stderr,“无法打开套接字”\n);
fprintf(stderr,“errno=%d\n”,errno);
fprintf(stderr,“错误描述为:%s\n”,strerror(errno));
返回结果;
}
CLog::Log(LOGINFO,“套接字已成功打开”);
文件*fp=fopen(“/proc/net/dev”,“r”);
如果(!fp)
{
//待定:错误
返回结果;
}
char*line=NULL;
尺寸线L=0;
int n;
char*p;
int linenum=0;
而(getdelim(&line,&linel,'\n',fp)>0)
{
//跳过前两行
if(linenum++<2)
继续;
p=直线;
while(isspace(*p))
++p;
n=strcspn(p,“:\t”);
p[n]=0;
strcpy(wreq.ifr_name,p);
id=新字符[IW_ESSID_MAX_SIZE+100];
wreq.u.essid.pointer=id;
wreq.u.essid.length=100;
if(ioctl(sockfd、SIOCGIWESSID和wreq)=-1){
继续;
}
其他的
{
strcpy(ESSID,id);
返回ESSID;
}
免费(id);
}
自由线;
fclose(fp);
返回结果;
}
注意:由于这个问题似乎在两个地方重复,我也在这里重复我的答案

您没有提到您是否正在使用独立的基本服务集(即,没有控制接入点的自组织网络),因此如果您没有尝试创建自组织网络,那么BSSID应该是本地接入点的MAC地址。可以用来访问该信息的
ioctl()
常量是
SIOCGIWAP
。ioctl有效负载信息将存储在
iwreq
结构的
u.ap\u addr.sa\u data