سؤال

لتجنب الاعتماد على الأدوات اللاسلكية أريد الحصول على اسيد مباشرة من الجهاز مع 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 المكالمات "الكتابة".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top