首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >想通过UBUNTU中的C++了解无线网络的ESSID吗?

想通过UBUNTU中的C++了解无线网络的ESSID吗?
EN

Stack Overflow用户
提问于 2011-05-09 20:30:48
回答 4查看 4.4K关注 0票数 6

我已经编写了以下程序来获取我的桌面当前所连接的无线网络的ESSID,但它给出了错误。有没有人能帮我纠正这些bug?代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/types.h> 
#include <fcntl.h>
#include <errno.h>
#include <linux/wireless.h>

#define IW_INTERFACE "wlan0"

extern int errno;
struct iwreq wreq;

int main (void)
{
    int sockfd;
    char * id;

    memset(&wreq, 0, sizeof(struct iwreq));
    sprintf(wreq.ifr_name, IW_INTERFACE);

    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));
        exit(1);
    }
    printf("Socket opened successfully \n");


    id = new char(IW_ESSID_MAX_SIZE+1);
    wreq.u.essid.pointer = id;
    if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
        fprintf(stderr, "Get ESSID ioctl failed \n");
        fprintf(stderr, "errno = %d \n", errno);
        fprintf(stderr, "Error description : %s\n",strerror(errno));
        exit(2);
    }
    printf("IOCTL Successfull\n");
    printf("ESSID is %s\n", wreq.u.essid.pointer);
    exit(0);
}

我收到以下错误:

代码语言:javascript
复制
  > 1. Get ESSID ioctl failed 
  > 2. errno = 7 
  > 3. Error description : Argument list too long
EN

回答 4

Stack Overflow用户

发布于 2013-11-02 03:05:48

在使用werq之前,你应该先正确设置长度,检查这个

代码语言:javascript
复制
int sockfd;
    char * id;
   id = new char[IW_ESSID_MAX_SIZE+1];

    struct iwreq wreq;
    memset(&wreq, 0, sizeof(struct iwreq));
    wreq.u.essid.length = IW_ESSID_MAX_SIZE+1;

    sprintf(wreq.ifr_name, IW_INTERFACE);

    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));
        exit(1);
    }
    printf("\nSocket opened successfully \n");

    wreq.u.essid.pointer = id;
    if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
        fprintf(stderr, "Get ESSID ioctl failed \n");
        fprintf(stderr, "errno = %d \n", errno);
        fprintf(stderr, "Error description : %s\n",strerror(errno));
        exit(2);
    }

    printf("IOCTL Successfull\n");

    printf("ESSID is %s\n", (char *)wreq.u.essid.pointer);
票数 4
EN

Stack Overflow用户

发布于 2011-05-09 21:10:02

您正在测试错误的ioctl(2)返回码。ioctl(2)在出错时返回-1,不为真(非零)。由于没有返回错误,因此errno中的值未定义且具有误导性。

它应该是:

代码语言:javascript
复制
if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
    fprintf(stderr, "Get ESSID ioctl failed \n");
    fprintf(stderr, "errno = %d \n", errno);
    fprintf(stderr, "Error description : %s\n",strerror(errno));
    exit(2);
}

编辑:去掉那些不正确的代码,下面是这样的:

代码语言:javascript
复制
id = new char(IW_ESSID_MAX_SIZE+1);

也许你的意思是:

代码语言:javascript
复制
id = new char[IW_ESSID_MAX_SIZE+1];

前者仅分配单个字符,并将其值设置为IW_ESSID_MAX_SIZE+1。后者分配一个大小为IW_ESSID_MAX_SIZE+1的数组。

通过这种更改,代码对我有效,并且不会为ioctl提供错误。

票数 3
EN

Stack Overflow用户

发布于 2011-05-10 02:07:34

尝试将wreq.u.essid.length设置为正确的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5937757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档