Question

Je souhaite obtenir une liste des réseaux sans fil disponibles. Idéalement, ce serait via un appel C, mais cela ne me dérange pas si je dois le retenir avec un appel système. Encore mieux si l’appel ou le programme C requis n’exige pas de forfait tiers exotique.

Internet semble suggérer que j'utilise sudo iwlist <interface> scan qui semble faire l'affaire en ligne de commande, mais je préfère ne pas avoir besoin d'autorisations root. Je veux seulement voir les bases, ne rien changer.

Était-ce utile?

La solution

Le package Outils sans fil - dont iwlist est une pièce - contient également une bibliothèque d'assistance des outils sans fil. Vous devez inclure iwlib.h et créer un lien avec libiw.a (c'est-à-dire ajouter -liw). Recherchez ensuite la documentation de la fonction iw_set_ext . Le paramètre SIOCSIWSCAN sera le plus utile. Pour un exemple d'utilisation de cette interface, jetez un coup d'œil à la source KWifiManager dans la bibliothèque KDE (voir: Méthode_wireless_wirelessextensions :: get_available_networks . Vous pouvez également télécharger le code source de Wireless Tools et observez comment la fonction iwlib iw_set_ext est également utilisée pour numériser dans iwlist.c.

En ce qui concerne les privilèges, j’imagine que le processus devra s’exécuter en tant que root pour permettre l’analyse. J'aimerais bien savoir si cela pourrait être fait autrement aussi.

Puisque vous utilisez Ubuntu 8.04, le package libiw-dev doit être d'utilisation.

Autres conseils

Il est assez facile de faire une analyse en ligne de commande. Les pages de manuel sont votre ami ici (consultez iwconfig et iwlist ). Mais utiliser l’interface C est un peu plus difficile, je vais donc me concentrer sur cela.

Tout d’abord, comme d’autres personnes l’ont déjà mentionné, téléchargez le code source des outils sans fil . Toute la documentation de l'interface de programmation se trouve dans les fichiers .c . Autant que je sache, il n’existe pas de documentation Web pour l’API. Cependant, le code source est assez facile à lire. Vous n'avez pratiquement besoin que de iwlib.h et de iwlib.c pour cette question.

Bien que vous puissiez utiliser iw_set_ext et iw_get_ext, libiw implémente une fonction d'analyse de base iw_scan, à partir de laquelle vous pouvez extraire la plupart des informations dont vous avez besoin.

Voici un programme simple pour obtenir l’ESSID pour tous les réseaux sans fil disponibles. Compilez avec -liw et exécutez avec sudo.

#include <stdio.h>
#include <time.h>
#include <iwlib.h>

int main(void) {
  wireless_scan_head head;
  wireless_scan *result;
  iwrange range;
  int sock;

  /* Open socket to kernel */
  sock = iw_sockets_open();

  /* Get some metadata to use for scanning */
  if (iw_get_range_info(sock, "wlan0", &range) < 0) {
    printf("Error during iw_get_range_info. Aborting.\n");
    exit(2);
  }

  /* Perform the scan */
  if (iw_scan(sock, "wlan0", range.we_version_compiled, &head) < 0) {
    printf("Error during iw_scan. Aborting.\n");
    exit(2);
  }

  /* Traverse the results */
  result = head.result;
  while (NULL != result) {
    printf("%s\n", result->b.essid);
    result = result->next;
  }

  exit(0);
}

AVERTISSEMENT: Ceci est juste un programme de démonstration. Il est possible que certains résultats ne soient pas essentiels. De plus, cela suppose que votre interface sans fil est & "; Wlan0 &"; Vous avez l'idée.

Lisez le code iwlib !

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top