Хотите узнать ESSID беспроводной сети через C ++ в UBUNTU - PullRequest
6 голосов
/ 09 мая 2011

Я написал следующую программу для получения 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 ]

4 голосов
/ 01 ноября 2013

Вы должны правильно установить длину перед использованием 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 голосов
/ 09 мая 2011

Вы проверяете код возврата ioctl(2) неправильно. ioctl(2) возвращает -1 при ошибке, не верно (не ноль). Поскольку ошибка не возвращается, значение в 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.

2 голосов
/ 09 мая 2011

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

1 голос
/ 13 февраля 2012

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