2011-05-09 10 views
5

Masaüstümün bağlı olduğu kablosuz ağın ESSID'sini almak için aşağıdaki programı yazdım, ancak bana hata veriyor. Birisi hataları düzeltmeme yardım edebilir mi? Kod: Ben hata aşağıdaki alıyorumKablosuz ağların ESSID değerini C++ ile UBUNTU aracılığıyla bilmek istiyorsunuz

#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 

cevap

3

hatalı ioctl(2) dönüş kodu test ediyoruz. ioctl(2) hata durumunda -1 döndürür, doğru değil (sıfırdan farklı). Bir hata iade edilmediğinden, errno'daki değer tanımlanmamıştır ve yanıltıcıdır.

Bunu şöyle olmalıdır:

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

Edit: yolumdan o yanlış kod ile, bu var:

id = new char(IW_ESSID_MAX_SIZE+1); 

Belki geliyordu:

id = new char[IW_ESSID_MAX_SIZE+1]; 

tahsis eski Sadece tek bir karakter ve değerini IW_ESSID_MAX_SIZE+1 olarak ayarlar. İkincisi, IW_ESSID_MAX_SIZE+1 boyutunda bir dizi tahsis eder.

Bu değişiklikle, kod benim için çalışır ve ioctl için bir hata vermez.

+0

haklısın ben bile söylediklerini çalıştı ama döndürülen değer olsa - 1 ioctl egif tarafından (ioctl (sockfd, SIOCGIWESSID, & wreq) == -1) { fprintf (stderr, "Get ESSID ioctl başarısız \ n"); fprintf (stderr, "errno =% d \ n", errno); fprintf (stderr, "Hata açıklaması:% s \ n", strerror (errno)); printf ("ESSID,% s \ n", wreq.u.essid.pointer); –

+0

@Alan: Sorunu düzenledim. Lütfen hala yanlış olup olmadığını söyle. – camh

+0

Teşekkürler ama çözümünüz çalışmıyor. –

2

Doğru değere wreq.u.essid.length ayarlamayı deneyin.

+0

Açıklamak gerekirse, wreq.u. memset sıfırdır. Bu yüzden özdeyiş uzunluğu 0'dır. Errno 7 biraz yanıltıcıdır, ancak temel olarak "sizin belirtilen ayrılmış alanınız değeri tutacak kadar uzun değil". – Mel

1

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"); 
2
Sen werq çek bu kullanmadan önce düzgün ilk uzunluğunu belirlesin

,

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