ioctl IOCGIWSCAN:无效的参数,

时间:2013-08-07 15:21:08

标签: c ioctl iwconfig

大家好,我正在尝试获取信息,所以iwlist命令。 我得到了一个无效的论据错误,我不明白为什么,我正在写一篇关于这个问题的好文章: ioctl & iwreq 。 我的代码是同伴:

#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <netpacket/packet.h>
#include <netinet/if_ether.h>
#include "ioctlcmd.h"
#include <arpa/inet.h>

/*  SIOCGIWNAME     0x8B01  power
    SIOCGIWTXPOW    0x8B27  
    SIOCSIWFREQ     0x8B04        set channel/frequency (Hz)   
*/



int check_ifname_exist(char * ifname) {

    int sock = socket(AF_PACKET,SOCK_RAW,0) ; 
    if (sock == RET_ERR) {
      printf("Error while checking ifname [ERRNO : %d], [STRERROR : %s]\n",errno,strerror(errno)); 
      return RET_ERR ; 
    }   

    struct ifreq ifr ; 
    strncpy(ifr.ifr_name,ifname,IFNAMSIZ) ;

    int ret = ioctl(sock,SIOCGIFINDEX,&ifr) ; 
    if (ret == RET_ERR) {
      printf("Error while checking ifname [ERRNO : %d], [STRERROR : %s]\n",errno,strerror(errno)); 
      return RET_ERR ; 
    }

   return RET_SUCCES ; 
}

int get_channel_fq(char * essid, char * ifname) {

  int sock = socket(AF_PACKET,SOCK_RAW,0) ; 
  if (sock == RET_ERR) {
    fprintf(stderr,"Error while opening socket [ERRNO : %d] [STRERROR : %s]\n",errno,strerror(errno)); 
    return RET_ERR ;    
  }

  if (bind_socket(ifname,sock) == RET_ERR)
    return RET_ERR ; 
  printf("coucou\n") ; //DEBUG 
  struct iwreq iwr ; 
  memset(&iwr,0,sizeof(struct iwreq)) ; 
  memcpy(iwr.ifr_ifrn.ifrn_name,ifname,IFNAMSIZ) ;
  printf("%s\n",iwr.ifr_ifrn.ifrn_name) ;   
  iwr.u.data.pointer = essid ; 
  iwr.u.data.length = strlen(essid)+1 ; 
  iwr.u.data.flags |= IW_SCAN_THIS_ESSID ; 

  if ((sock =ioctl(sock,SIOCSIWSCAN,&iwr)) == RET_ERR) {
    fprintf(stderr,"Error while getting the freq of the card. [ERRNO : %d] [STRERROR : %s]\n",errno,strerror(errno)) ; 
    return RET_ERR ; 
  }
  printf("coucou\n") ;  // DEBUG
  int bufsize = 4096 ;
  struct iwreq iwr2 ={0} ; 
  //memset(&iwr2,0,sizeof(struct iwreq)) ; 
  char  *p = NULL ; 
  p=calloc(bufsize,1) ; 
  iwr2.u.data.pointer = p ; 
  iwr2.u.data.length = bufsize ; 
  iwr2.u.data.flags = 0 ;
  memcpy(iwr2.ifr_ifrn.ifrn_name,ifname,IFNAMSIZ) ;
  if (ioctl(sock,SIOCGIWSCAN,&iwr2) == RET_ERR) { // ERROR 
         fprintf(stderr,"Error while getting the freq of the card. [ERRNO : %d] [STRERROR : %s]\n",errno,strerror(errno)) ; // ERROR IS HERE
         return RET_ERR ;
  }

   return RET_SUCCES ; 
}

int bind_socket(char * ifname,int sock_fd) {

  struct ifreq ifr ; 
  struct sockaddr_ll sall ; 
  memset(&sall,0,sizeof(struct sockaddr_ll)) ; 
  strncpy(ifr.ifr_name,ifname,IFNAMSIZ) ; 
  ifr.ifr_addr.sa_family = AF_INET ; 

  if (ioctl(sock_fd,SIOCGIFINDEX,&ifr) == RET_ERR) 
    goto ret_err ; 
  if (ifr.ifr_ifindex < 0) 
     goto ret_err ; 

  sall.sll_ifindex = ifr.ifr_ifindex  ; 
  sall.sll_family = AF_PACKET ; 
  sall.sll_protocol = htons(ETH_P_ALL) ; 

  if (bind(sock_fd,(struct sockaddr *)&sall,sizeof(sall)) == RET_ERR) 
    goto ret_err ;

  return sock_fd ; 

ret_err : 

   fprintf(stderr,"Error while binding socket. [ERRNO = %d] [STDERROR = %s]\n",errno,strerror(errno)) ; 
   return RET_ERR ; 
}

int main() {

   get_channel_fq("ditwifi","wlan0") ; 
}

在上面的代码中,打印了两个printf(“coucou”),所以我确定第一个ioctl()      的ioctl(袜子,IOCSIWSCAN,&安培; IWR) 工作良好。

我想我错过了什么,但我找不到。

非常感谢。

1 个答案:

答案 0 :(得分:0)

iwreq结构必须指向一个足以容纳响应的缓冲区(AP列表)。