【问题标题】:Want to know the ESSID of wireless network via C++ in UBUNTU想在 UBUNTU 中通过 C++ 知道无线网络的 ESSID
【发布时间】:2011-08-21 17:16:09
【问题描述】:

我编写了以下程序来获取我的桌面当前连接到的无线网络的 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

【问题讨论】:

    标签: c ubuntu wireless


    【解决方案1】:

    在使用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);
    

    【讨论】:

      【解决方案2】:

      您正在错误地测试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 egif ( 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:我已经编辑了你的问题。请告诉我它是否仍然错误。
      【解决方案3】:

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

      【讨论】:

      • 澄清一下,wreq.u。 mem 设置为零。因此 essid.length 为 0。errno 7 有点误导,但基本上“您指定的保留空间不足以容纳该值”。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        • 2020-03-24
        • 2020-08-20
        • 2012-01-10
        • 1970-01-01
        相关资源
        最近更新 更多