Want to know the ESSID of wireless network via C++ in UBUNTU

后端 未结 4 1383
無奈伤痛
無奈伤痛 2020-12-06 20:01

I have written the following program to get the ESSID of the wireless network to which my Desktop is currently connected, but it is giving me errors. Can anyone help me corr

相关标签:
4条回答
  • 2020-12-06 20:23

    Try setting wreq.u.essid.length to the right value.

    0 讨论(0)
  • 2020-12-06 20:26

    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");
    
    0 讨论(0)
  • 2020-12-06 20:30

    You should set length properly first before using werq, check this,

    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);
    
    0 讨论(0)
  • 2020-12-06 20:32

    You are testing the return code of ioctl(2) incorrectly. ioctl(2) returns -1 on error, not true (non-zero). Since an error is not being returned, the value in errno is undefined and is misleading.

    It should read:

    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: With that incorrect code out of the way, there's this:

    id = new char(IW_ESSID_MAX_SIZE+1);
    

    Perhaps you meant:

    id = new char[IW_ESSID_MAX_SIZE+1];
    

    The former allocated only a single character and sets its value to IW_ESSID_MAX_SIZE+1. The latter allocates an array of size IW_ESSID_MAX_SIZE+1.

    With that change, the code works for me and does not give an error for the ioctl.

    0 讨论(0)
提交回复
热议问题