Frage

Um zu vermeiden, auf den drahtlosen Werkzeugen, die auf die es essid direkt aus dem Gerät mit ioctl erhalten möge, in C wäre dies kein Problem sein, aber in Ruby ist es ganz anders aus.

Das Problem ist folgende Struktur von wireless.h , die als Ein- / Antwort von ioctl verwendet wird:

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 */
};

Der Zeigerteil muss durch ein Flag-Feld, gefolgt von der Länge in Bytes, eine gültige Adresse eines Speicherbereiches, verfolgt werden. Ich habe versucht, mit Array # Pack und dem Bit-Struktur Juwel, aber noch keine Lösung noch nicht gefunden.

Gibt es eine Möglichkeit, diesen Speicherzeiger Problem zu umgehen?

War es hilfreich?

Lösung

ich es endlich arbeiten, die Lösung war, die ‚p‘ Argument der Packung auf diese Weise zu verwenden:

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

Andere Tipps

Sicher, definieren Sie einfach Ihre eigene Ruby-freundliche Oberfläche als Wrapper (in C) um ioctl. Ich mache das Problem mit dem Standard-ioctl in Ruby sehen. Ich denke, ios.ioctl meist für ioctl „schreiben“ Anrufe gedacht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top