Quiere saber el ESSID de la red inalámbrica a través de C++ en UBUNTU

4 minutos de lectura

He escrito el siguiente programa para obtener el ESSID de la red inalámbrica a la que está conectado actualmente mi escritorio, pero me está dando errores. ¿Alguien puede ayudarme a corregir los errores? Código:

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

Recibo el siguiente error:

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

Primero debe establecer la longitud correctamente antes de usar werq, verifique esto,

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

Está probando el código de retorno de ioctl(2) incorrectamente. ioctl(2) devuelve -1 en caso de error, no verdadero (distinto de cero). Dado que no se devuelve un error, el valor en errno no está definido y es engañoso.

Debería leer:

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

Editar: con ese código incorrecto fuera del camino, está esto:

id = new char(IW_ESSID_MAX_SIZE+1);

Quizás quisiste decir:

id = new char[IW_ESSID_MAX_SIZE+1];

El primero asignó un solo carácter y establece su valor en IW_ESSID_MAX_SIZE+1. Este último asigna una matriz de tamaño IW_ESSID_MAX_SIZE+1.

Con ese cambio me funciona el código y no da error para el ioctl.

  • Aunque tienes razón e incluso intenté lo que dijiste, pero el valor devuelto es -1 por ioctl egif (ioctl(sockfd, SIOCGIWESSID, &wreq) == -1) { fprintf(stderr, “Obtener ESSID ioctl falló \n”) ; fprintf(stderr, “errno = %d \n”, errno); fprintf(stderr, “Descripción del error: %s\n”,strerror(errno)); printf(“ESSID es %s\n”, wreq.u.essid.pointer);

    Alan

    9 de mayo de 2011 a las 13:35

  • @Alan: He editado tu pregunta. Por favor, dime si todavía está mal.

    – camh

    9 de mayo de 2011 a las 13:36

Intenta configurar wreq.u.essid.length al valor correcto.

  • Para aclarar, wreq.u. conjunto de memoria a cero. essid.length es por lo tanto 0. El errno 7 es un poco engañoso, pero básicamente “su espacio reservado indicado no es lo suficientemente largo para contener el valor”.

    – mel

    10 de mayo de 2011 a las 2:47

Quiere saber el ESSID de la red inalambrica a traves
ahmed koubaa

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad