Хотите узнать ESSID беспроводной сети через C в UBUNTU

#c #ubuntu #wireless

#c #ubuntu #беспроводная

Вопрос:

Я написал следующую программу, чтобы получить 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(amp;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 : %sn",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, amp;wreq) == -1) {
        fprintf(stderr, "Get ESSID ioctl failed n");
        fprintf(stderr, "errno = %d n", errno);
        fprintf(stderr, "Error description : %sn",strerror(errno));
        exit(2);
    }
    printf("IOCTL Successfulln");
    printf("ESSID is %sn", wreq.u.essid.pointer);
    exit(0);
}
  

Я получаю следующую ошибку:

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

Ответ №1:

Вы должны правильно установить длину, прежде чем использовать werq, проверьте это,

 int sockfd;
    char * id;
   id = new char[IW_ESSID_MAX_SIZE 1];

    struct iwreq wreq;
    memset(amp;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 : %sn",strerror(errno));
        exit(1);
    }
    printf("nSocket opened successfully n");

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

    printf("IOCTL Successfulln");

    printf("ESSID is %sn", (char *)wreq.u.essid.pointer);
  

Ответ №2:

Вы неправильно тестируете код возврата ioctl(2) . ioctl(2) возвращает -1 при ошибке, неверно (ненулевое значение). Поскольку ошибка не возвращается, значение в errno не определено и вводит в заблуждение.

Он должен гласить:

 if (ioctl(sockfd,SIOCGIWESSID, amp;wreq) == -1) {
    fprintf(stderr, "Get ESSID ioctl failed n");
    fprintf(stderr, "errno = %d n", errno);
    fprintf(stderr, "Error description : %sn",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.

Комментарии:

1. Хотя вы правы, и я даже пытался сделать то, что вы сказали, но значение, возвращаемое ioctl, равно -1, например,if (ioctl(sockfd, SIOCGIWESSID, amp;wreq) == -1) { fprintf(stderr, «Не удалось получить ESSID ioctl n»); fprintf(stderr, «errno = % d n», errno); fprintf(stderr, «Описание ошибки: %sn»,strerror(errno)); printf(«ESSID равен %sn», wreq.u.essid.pointer);

2. @Alan: Я отредактировал ваш вопрос. Пожалуйста, скажите мне, если это все еще неправильно.

Ответ №3:

Попробуйте установить wreq.u.essid.length правильное значение.

Комментарии:

1. Чтобы уточнить, восстановите значение.u. memset равным нулю. essid. таким образом, длина равна 0. Ошибка 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, amp;wreq) == -1) {
    fprintf(stderr, "Get ESSID ioctl failed n");
    fprintf(stderr, "errno = %d n", errno);
    fprintf(stderr, "Error description : %sn",strerror(errno));
    exit(2);
}
printf("IOCTL Successfulln");