Ruby에서 ioctl을 통해 Essid를 얻습니다
문제
무선 도구에 의존하지 않기 위해 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
"쓰기"전화.
제휴하지 않습니다 StackOverflow