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