Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1587 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Cherche lib + howto pour utiliser le pilote wifi (linux)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Cherche lib + howto pour utiliser le pilote wifi (linux)

n°1914447
burn2
ça rox du poney
Posté le 12-08-2009 à 15:47:48  profilanswer
 

Bonjour à tous et toutes, j'aurais besoin de votre aide, je cherche une lib qui me permettrais en C++ de lister les point d'accés existant (leur qualitée de signal mais au minimum le nom et si c'est protégé ou pas) et de pouvoir m'y authentifier.
 
J'ai bien vu la lib wireless.h ou iwlib (libiw) mais je ne trouve pas d'exemple clair facile à comprendre (c'est en général de gros pavé sans vrais commentaires en C avec des structures de partout.  :cry: )
 
Avez vous un tuto miracle ou une lib "courante" facile d'utilisation? (parce que bon tout ces struct en C ce n'est pas l'idéal tout de même).
Le tout doit être disponible sous linux. L'idéal serait en fait un exemple clair ou tutorial pour la lib iwlib car je suis sûr qu'elle est dispo sur la plateforme ou le programme va tourner, mais si vous en avez une plus facile (ou en relation avec QT).
 
Merci d'avance
 
 
EDIt: Bien sûr je pourrais faire un iwlist vers un fichier puis parcourir le résultat mais ce n'est pas vraiment l'idéal. :/ Il n'y a pas vraiment moyen de gérer les erreurs.


Message édité par burn2 le 12-08-2009 à 16:02:47

---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
mood
Publicité
Posté le 12-08-2009 à 15:47:48  profilanswer
 

n°1914545
Joel F
Real men use unique_ptr
Posté le 12-08-2009 à 18:55:23  profilanswer
 

Au pire, fait un popen en C et recupére le stdout de iwlist et traite les chaines de caractères retournées.

n°1914549
burn2
ça rox du poney
Posté le 12-08-2009 à 19:20:21  profilanswer
 

Ouep c'est ce que je pensais aussi, mais pour le coup l'association ça serait avec un iwconfig, ça passe mais c'est pas l'idéal :/
Doit bien y avoir des libs pour faire ça. Déjà iwlib le fait, mais j'avoue ne point comprendre son utilisation. :/


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1914607
Joel F
Real men use unique_ptr
Posté le 13-08-2009 à 08:22:58  profilanswer
 

et y a pas de doc ?
paye tes lib open sources quoi :sarcastic:

n°1914647
burn2
ça rox du poney
Posté le 13-08-2009 à 09:58:01  profilanswer
 

Ben je ne trouve pas de doc non. :/ D'habitude y en a plein (contrairement à ce que tu dis sur l'openSource :o)
Mais là personnellement c'est assez flou. :/
ET les struct pommés dans un .h c'est pas vraiment parlant pour moi. :/
 
Il faut que QT nous sorte la lib magique :o


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1914839
sligor
Posté le 13-08-2009 à 15:39:46  profilanswer
 

ça a l'air jouable quand même:

 
Code :
  1. /* --------------------- SCANNING SUBROUTINES --------------------- */
  2. int
  3. iw_process_scan(int   skfd,     /* Socket to the kernel */
  4.   char *   ifname, /* Device name */
  5.   int   we_version,
  6.   wireless_scan_head * context);
  7. int
  8. iw_scan(int   skfd, /* Socket to the kernel */
  9.  char *   ifname,  /* Device name */
  10.  int   we_version,
  11.  wireless_scan_head * context);
 

qui retourne une liste chainée vers les differents points d'accés trouvés dans (wireless_scan_head * context):

 
Code :
  1. /* Structure for storing an entry of a wireless scan.
  2. * This is only a subset of all possible information, the flexible
  3. * structure of scan results make it impossible to capture all
  4. * information in such a static structure. */
  5. typedef struct wireless_scan
  6. {
  7.   /* Linked list */
  8.   struct wireless_scan * next;
  9.   /* Cell identifiaction */
  10.   int  has_ap_addr;
  11.   sockaddr ap_addr;  /* Access point address */
  12.   /* Other information */
  13.   struct wireless_config b; /* Basic information */
  14.   iwstats stats;   /* Signal strength */
  15.   int  has_stats;
  16.   iwparam maxbitrate;  /* Max bit rate in bps */
  17.   int  has_maxbitrate;
  18. } wireless_scan;
  19. /*
  20. * Context used for non-blocking scan.
  21. */
  22. typedef struct wireless_scan_head
  23. {
  24.   wireless_scan * result;  /* Result of the scan */
  25.   int   retry;  /* Retry level */
  26. } wireless_scan_head;


Message édité par sligor le 13-08-2009 à 15:40:15
n°1914843
sligor
Posté le 13-08-2009 à 15:48:34  profilanswer
 

en fait la doc des fonctions est dans le source pas dans l'en-tête :D
 

Code :
  1. /*********************** SCANNING SUBROUTINES ***********************/
  2. /*
  3. * The Wireless Extension API 14 and greater define Wireless Scanning.
  4. * The normal API is complex, this is an easy API that return
  5. * a subset of the scanning results. This should be enough for most
  6. * applications that want to use Scanning.
  7. * If you want to have use the full/normal API, check iwlist.c...
  8. *
  9. * Precaution when using scanning :
  10. * The scanning operation disable normal network traffic, and therefore
  11. * you should not abuse of scan.
  12. * The scan need to check the presence of network on other frequencies.
  13. * While you are checking those other frequencies, you can *NOT* be on
  14. * your normal frequency to listen to normal traffic in the cell.
  15. * You need typically in the order of one second to actively probe all
  16. * 802.11b channels (do the maths). Some cards may do that in background,
  17. * to reply to scan commands faster, but they still have to do it.
  18. * Leaving the cell for such an extended period of time is pretty bad.
  19. * Any kind of streaming/low latency traffic will be impacted, and the
  20. * user will perceive it (easily checked with telnet). People trying to
  21. * send traffic to you will retry packets and waste bandwidth. Some
  22. * applications may be sensitive to those packet losses in weird ways,
  23. * and tracing those weird behavior back to scanning may take time.
  24. * If you are in ad-hoc mode, if two nodes scan approx at the same
  25. * time, they won't see each other, which may create associations issues.
  26. * For those reasons, the scanning activity should be limited to
  27. * what's really needed, and continuous scanning is a bad idea.
  28. * Jean II
  29. */
  30. /*------------------------------------------------------------------*/
  31. /*
  32. * Process/store one element from the scanning results in wireless_scan
  33. */
  34. static inline struct wireless_scan *
  35. iw_process_scanning_token(struct iw_event *  event,
  36.     struct wireless_scan * wscan)
  37. /*------------------------------------------------------------------*/
  38. /*
  39. * Initiate the scan procedure, and process results.
  40. * This is a non-blocking procedure and it will return each time
  41. * it would block, returning the amount of time the caller should wait
  42. * before calling again.
  43. * Return -1 for error, delay to wait for (in ms), or 0 for success.
  44. * Error code is in errno
  45. */
  46. int
  47. iw_process_scan(int   skfd,
  48.  char *   ifname,
  49.  int   we_version,
  50.  wireless_scan_head * context)
  51. /*------------------------------------------------------------------*/
  52. /*
  53. * Perform a wireless scan on the specified interface.
  54. * This is a blocking procedure and it will when the scan is completed
  55. * or when an error occur.
  56. *
  57. * The scan results are given in a linked list of wireless_scan objects.
  58. * The caller *must* free the result himself (by walking the list).
  59. * If there is an error, -1 is returned and the error code is available
  60. * in errno.
  61. *
  62. * The parameter we_version can be extracted from the range structure
  63. * (range.we_version_compiled - see iw_get_range_info()), or using
  64. * iw_get_kernel_we_version(). For performance reason, you should
  65. * cache this parameter when possible rather than querying it every time.
  66. *
  67. * Return -1 for error and 0 for success.
  68. */
  69. int
  70. iw_scan(int   skfd,
  71. char *   ifname,
  72. int   we_version,
  73. wireless_scan_head * context)

n°1914860
burn2
ça rox du poney
Posté le 13-08-2009 à 16:20:20  profilanswer
 

Oui j'avais regardé tout ça, mais si je prends  
int
iw_process_scan(int   skfd,     /* Socket to the kernel */
  char *   ifname, /* Device name */
  int   we_version,
  wireless_scan_head * context);
 
tu comprends comment t'en servir toi? Tu sais comment lui fournir le socket vers le kernel? Tu comprends comment et sous quelle structure sera fourni le résultat?  
 
Rien de tel que des exemples simples d'utilisation pour comprendre comment le faire, et ça je n'en ai trouvé aucun. :/
 
EDIT; je n'avais pas vu que tu parlais d'une liste chainée, ok c'est déjà une info et là je comprends mieux, mais avec un exemple ça serait bien plus facile à comprendre et à voir.
 
J'essaierais ce soir voir si j'arrive au moins à récupérer les infos.


Message édité par burn2 le 13-08-2009 à 16:25:04

---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1914866
sligor
Posté le 13-08-2009 à 16:29:58  profilanswer
 

en faisant une recherche dans le code source on retrouve souvent

Code :
  1. if((skfd = iw_sockets_open()) < 0)


;)

n°1914870
sligor
Posté le 13-08-2009 à 16:40:45  profilanswer
 

on utilisant le fabuleux moteur de recherche qu'est google j'ai trouvé ça:
 
http://svn.pardus.org.tr/projeler/tasmanet/device.cpp

Code :
  1. QStringList Device::scanWifiNetwork( const char *dev )
  2. {
  3.     wireless_scan_head wsh;
  4.     wireless_scan *ws;
  5.     int skfd = sockets_open();
  6.     int ret = iw_scan( skfd, ( char* )dev, WIRELESS_EXT, &wsh );
  7.     if ( ( ret == -1 ) && ( errno == ENODATA ) ) {
  8.         // wait for device for one more second :).
  9.         sleep( 1 );
  10.         ret = iw_scan ( skfd, ( char* )dev, WIRELESS_EXT, &wsh );
  11.         if ( ret == -1 ) {
  12.             close ( skfd );
  13.             return QStringList();
  14.         }
  15.     }
  16.     // iterate over results
  17.     QStringList networks;
  18.     ws = wsh.result;
  19.     while( ws ) {
  20.         networks.append( ws->b.essid );
  21.         ws = ws->next;
  22.     }
  23.     free_scan_results(wsh.result);
  24.     return networks;
  25. }


 
voilà tu l'as ton exemple :)

mood
Publicité
Posté le 13-08-2009 à 16:40:45  profilanswer
 

n°1914882
burn2
ça rox du poney
Posté le 13-08-2009 à 16:53:58  profilanswer
 

Ah ben ça alors!  Merci beaucoup!
Je dois être une quiche en langage google car je n'ai pas du tout trouvé d'exemple!
T'as tapé quoi précisément?
 
Et tu aurais un exemple d'association à un point d'accés?

Message cité 1 fois
Message édité par burn2 le 13-08-2009 à 16:55:44

---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1914884
sligor
Posté le 13-08-2009 à 16:55:59  profilanswer
 

burn2 a écrit :


T'as tapé quoi précisément?


iw_scan  :D

n°1914892
burn2
ça rox du poney
Posté le 13-08-2009 à 17:06:52  profilanswer
 

Ok... Moi j'avais tappé le nom de la bibliothèque et forcément ça n'avait rien donné.
 
Merci beaucoup de ton aide. :)
 
/note personnelle penser à chercher en tapant le nom d'une fonction de lib et pas le nom de la lib directement...


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1914929
burn2
ça rox du poney
Posté le 13-08-2009 à 19:14:59  profilanswer
 

Bon forcément ça se passe mal.
Je rajoute les libs qu'il a inclu je fais juste le test avec quelques fonctions et j'ai droit à:

Citation :


build/dialogimpl.o: In function `scanWifiNetwork(char const*)':
dialogimpl.cpp:(.text+0x12a): undefined reference to `iw_scan'
dialogimpl.cpp:(.text+0x28e): undefined reference to `iw_scan

...
Je ne sais pas trop quoi penser.
 
(bien sûr j'inclue bien iwlib.h et toutes les lib qu'il a mis)


Message édité par burn2 le 13-08-2009 à 19:20:18

---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1914932
xilebo
noone
Posté le 13-08-2009 à 19:17:55  profilanswer
 

t'aurais pas oublié un -liw au link ? Et si ta lib n'est pas dans /usr/lib, il faut préciser le path avec -L

n°1914934
burn2
ça rox du poney
Posté le 13-08-2009 à 19:23:42  profilanswer
 

J'utilise le compilateur par défaut, et la lib est bien dans mon /usr/include. donc logiquement il doit la trouver sans que j'ai besoin de linker non?
en mettant mon #include tout simplement?


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1914936
burn2
ça rox du poney
Posté le 13-08-2009 à 19:30:39  profilanswer
 

BOn j'ai rien dit c'était bien ça! Pff faut que je me dérouille là. Merci.
 
EDIT: j'allais dire que ça ne marchait pas avant de me rendre compte qu'il faut que je sois en root pour que ça passe, j'arrive déjà à lister. :)


Message édité par burn2 le 13-08-2009 à 19:37:49

---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1915194
Taz
bisounours-codeur
Posté le 14-08-2009 à 16:33:59  profilanswer
 

Ca serait pas mieux de s'appuyer sur network manager ?

n°1915236
burn2
ça rox du poney
Posté le 14-08-2009 à 17:43:00  profilanswer
 

Non. :o
Pour la simple est bonne raison qu'il n'est pas forcément installé partout et qu'en l'occurence sur la machine ou ça tournera, il n'y sera pas. :o
(freeruner...)


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1915481
burn2
ça rox du poney
Posté le 16-08-2009 à 09:20:58  profilanswer
 

Par contre j'ai bien peur qu'avec cette lib on ne puisse pas faire du chiffrage wpa, je ne vois pas vraiment de connexion autre que juste s'associer à un point d'accès. (équivalent du iwconfig essid monpoint).


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1915482
burn2
ça rox du poney
Posté le 16-08-2009 à 10:08:44  profilanswer
 

Je galère aussi pour arriver à récupérer le type de chiffrage. :/ Je me demande s'il n'y a pas mieux comme solution. :/


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1915488
burn2
ça rox du poney
Posté le 16-08-2009 à 12:00:13  profilanswer
 

Bon finalement je fais avec un popen + parcours ligne à ligne et recherche de string dans le résultat et c'est bon je récupère ce que je veux. ça ne sera pas parfait mais bon pour l'instant je ne vois guerre d'autres solutions.


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] Cherche lib + howto pour utiliser le pilote wifi (linux)

 

Sujets relatifs
accès à fonction importée à accè à fonction importé.( Prog C )Probleme Afficheur Lcd 2x16
[Résolut]Traduction du C++utilisation d'un librairie C avec Ada.
[Divers][Lecture]Utilisation de la bibliothèque portmidi : Pm_Read()svn: 'C:\machin is already a working copy for a different URL
C++ fonction d'une ligne : besoin d'accolades ?Je cherche à me débarrasser d'un débugger lié à l'interprêteur
socket pas thread safe sous linux ? si en fait (resolu)Peut-on encore utiliser les tableaux dans la mise en page ?
Plus de sujets relatifs à : [C++] Cherche lib + howto pour utiliser le pilote wifi (linux)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR