3

ワイヤレスツールに依存することを避けるために、ioctlを使用してデバイスから直接essidを取得したいのですが、Cではこれは問題になりませんが、Rubyではまったく異なります。

問題は、ioctlの入力/応答として使用されるwireless.hからの構造体に従うことです。

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とbit-struct gemを試してみましたが、まだ解決策が見つかりません。

このメモリポインタの問題を回避する方法はありますか?

4

2 に答える 2

4

私はついにそれを機能させました、解決策はこのようにパックの「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
于 2009-09-23T09:32:48.317 に答える
1

もちろん、Rubyに適した独自のインターフェースをioctlのラッパー(C)として定義するだけです。Rubyのデフォルトのioctlに問題があります。私は主に「書き込み」呼び出しios.ioctlを目的としていると思います。ioctl

于 2009-09-18T22:26:28.553 に答える