문제

무선 도구에 의존하지 않기 위해 IOCTL을 사용하여 장치에서 직접 ESSID를 가져오고 싶습니다. C에서는 문제가되지 않지만 Ruby에서는 상당히 다릅니다.

문제는 구조물을 따르는 것입니다 무선 .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 */
};

포인터 부품은 메모리 영역의 유효한 주소 여야하고 길이가 바이트 인 다음 플래그 필드 여야합니다. 배열#팩과 비트 스트럭 보석으로 시도했지만 아직 해결책을 찾지 못했습니다.

이 메모리 포인터 문제를 우회하는 방법이 있습니까?

도움이 되었습니까?

해결책

나는 마침내 그것을 작동 시켰습니다. 해결책은 팩의 '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

다른 팁

물론, 자신의 루비 친화적 인 인터페이스를 IOCTL 주변의 래퍼 (C)로 정의하십시오. 루비의 기본 IOCTL에 문제가 있습니다. 나는 추측한다 ios.ioctl 주로 의도 된 것입니다 ioctl "쓰기"전화.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top