Вопрос

Чтобы не полагаться на беспроводные инструменты, я хочу получить essid непосредственно с устройства с помощью ioctl, в C это не будет проблемой, но в Ruby все по-другому.

Проблема в следующем: структура из wireless.h , которая используется как ввод / ответ 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 */
};

Часть указателя должна быть действительным адресом области памяти, за которой следует длина в байтах, за которой следует поле флага. Я пытался использовать Array # pack и gem bit-struct, но пока не нашел решения.

Есть ли способ обойти эту проблему с указателем памяти?

Это было полезно?

Решение

Я наконец-то начал работать, решение было использовать аргумент 'p' пакета следующим образом:

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

Другие советы

Конечно, просто определите свой собственный дружественный к Ruby интерфейс как оболочку (в C) для ioctl. Я вижу проблему с ioctl по умолчанию в Ruby. Я думаю, ios.ioctl в основном предназначен для ioctl " write " звонки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top