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

Я написал следующую программу, чтобы получить ESSID беспроводной сети, к которой подключен мой рабочий стол, но он дает мне ошибки. Может ли кто-нибудь помочь мне исправить ошибки? Код:

#include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #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 

Вы неправильно проверяете код возврата 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.

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

Вы должны правильно установить длину перед использованием 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); 

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