Erste essid über ioctl in ruby
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?
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.