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

6 c ubuntu wireless

我编写了以下程序来获取我的桌面当前连接的无线网络的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);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

  > 1. Get ESSID ioctl failed 
  > 2. errno = 7 
  > 3. Error description : Argument list too long
Run Code Online (Sandbox Code Playgroud)

p.j*_*p.j 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);
Run Code Online (Sandbox Code Playgroud)


cam*_*amh 3

您正在错误地测试返回代码ioctl(2)ioctl(2)出错时返回 -1,而不是 true(非零)。由于未返回错误,因此 in 中的值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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:排除了错误的代码后,结果如下:

id = new char(IW_ESSID_MAX_SIZE+1);
Run Code Online (Sandbox Code Playgroud)

也许你的意思是:

id = new char[IW_ESSID_MAX_SIZE+1];
Run Code Online (Sandbox Code Playgroud)

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

经过这一更改,代码对我有用,并且不会给出 ioctl 错误。