الحصول على اسيد عبر IOCTL في روبي
سؤال
لتجنب الاعتماد على الأدوات اللاسلكية أريد الحصول على اسيد مباشرة من الجهاز مع IOCTL، في C وهذا لن يكون مشكلة، ولكن في روبي انها مختلفة تماما.
والمشكلة فيما يلي البنية من 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 */
};
ويجب أن يكون جزءا مؤشر عنوانا صالحا من منطقة الذاكرة، تليها الطول في بايت، تليها حقل العلم. حاولت مع صفيف # حزمة والأحجار الكريمة بت البنية، ولكن لا يمكن العثور على حل حتى الان.
هل هناك طريقة لتجاوز هذه المشكلة مؤشر الذاكرة؟
المحلول
وأخيرا حصلت على عمل، وكان الحل لاستخدام 'ع' حجة حزمة بهذه الطريقة:
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
نصائح أخرى
وبالتأكيد، فقط تحديد واجهة خاصة بك صديقة روبي باعتباره المجمع (في C) حول IOCTL. أنا لا أرى مشكلة مع IOCTL الافتراضي في روبي. اعتقد المقصود ios.ioctl
في الغالب لioctl
المكالمات "الكتابة".
لا تنتمي إلى StackOverflow