Domanda

Per evitare di fare affidamento sugli strumenti wireless, voglio ottenere l'essid direttamente dal dispositivo con ioctl, in C questo non sarebbe un problema, ma in Ruby è abbastanza diverso.

Il problema sta seguendo la struttura di wireless.h utilizzata come input / risposta di ioctl:

struct  iw_point
{
  void __user *pointer; /* Pointer to the data  (in user space) */
  __u16   length;   /* number of fields or size in bytes */
  __u16   flags;    /* Optional params */
};

La parte del puntatore deve essere un indirizzo valido di un'area di memoria, seguita dalla lunghezza in byte, seguita da un campo flag. Ho provato con Array # pack e la gemma bit-struct, ma non ho ancora trovato una soluzione.

C'è un modo per aggirare questo problema con il puntatore della memoria?

È stato utile?

Soluzione

Finalmente ho funzionato, la soluzione era usare l'argomento 'p' del pacchetto in questo modo:

require "socket"

# Copied from wireless.h
SIOCGIWESSID      = 0x8B1B
IW_ESSID_MAX_SIZE = 32

iwreq = [ "wlan0", " " * IW_ESSID_MAX_SIZE, IW_ESSID_MAX_SIZE, 0 ].pack("a16pII")

sock = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)

sock.ioctl(SIOCGIWESSID, iwreq)

interface, essid, len, flags = iwreq.unpack("a16pII")

puts essid

Altri suggerimenti

Certo, basta definire la propria interfaccia per Ruby come un wrapper (in C) attorno a ioctl. Vedo il problema con lo ioctl predefinito in Ruby. Suppongo che ios.ioctl sia destinato principalmente a ioctl " write " chiamate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top