在UBUNTU中通过C++想要知道无线网络的ESSID

7

我编写了以下程序以获取我的桌面计算机当前连接的无线网络的ESSID,但它给我报错。有人能帮我纠正错误吗? 代码:

#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);
}

我正在遇到以下错误:

  > 1. Get ESSID ioctl failed 
  > 2. errno = 7 
  > 3. Error description : Argument list too long
4个回答

5

在使用werq之前,您应该首先正确设置长度,请检查以下内容:

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);

3
您正在错误地测试ioctl(2)的返回代码。 ioctl(2)在发生错误时返回-1,而不是true(非零值)。由于没有返回错误,因此errno中的值是未定义的并且具有误导性。
应该这样写:
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);
}

编辑:有了那个错误的代码之后,还有这个:
id = new char(IW_ESSID_MAX_SIZE+1);

也许您的意思是:
id = new char[IW_ESSID_MAX_SIZE+1];

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

有了这个更改,代码对我来说可以正常工作,并且不会出现ioctl错误。


虽然您是正确的,我甚至尝试了您所说的,但ioctl返回的值是-1,例如:if (ioctl(sockfd,SIOCGIWESSID,&wreq) == -1) { fprintf(stderr,"获取ESSID ioctl失败\n"); fprintf(stderr,"errno =%d \n",errno); fprintf(stderr,"错误描述:%s\n",strerror(errno)); printf("ESSID为%s\n",wreq.u.essid.pointer); - Alan
@Alan:我已经编辑了你的问题,请告诉我是否还有错误。 - camh

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

澄清一下,wreq.u. memset为零。因此,essid.length为0。错误号7有点误导人,但基本上是“您指示的保留空间不足以容纳该值”。 - Mel

1

printf("套接字成功打开 \n");

//id = new char(IW_ESSID_MAX_SIZE+1);
char buffer[32];
memset(buffer, 0, 32);
wreq.u.essid.pointer = buffer;
wreq.u.essid.length = 32;

//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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接