3

mac os x 初心者です。外部に到達可能な IP ネットワークではなく、物理 NIC カード リンクのアップ/ダウン イベントを検出するスレッドが必要です。

私が得た古い方法は、select/timerを使用して、ioctlを介してインターフェースフラグをポーリングすることです...

Apple の API を使用した完全な例はありますか? カーネルへのコールバックを登録して永久に実行したいですか? コールバックをトリガーする変更 (リンクアップ <--> キンク ダウン) がある場合は?

ありがとう、

4

1 に答える 1

0

up / downイベントでコードをテストしていませんが、オン/オフで機能するため、機能する可能性があります。そして、私はエラー処理がないことを知っています。

#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <net/if.h>
#include <sys/kern_event.h>

int main(int argc,char** argv) {
   // create a socket of type PF_SYSTEM to listen for events
   int s = socket(PF_SYSTEM, SOCK_RAW, SYSPROTO_EVENT);
   // make sure we get receive the correct events
   kev_request key;
   key.vendor_code = KEV_VENDOR_APPLE;
   key.kev_class = KEV_NETWORK_CLASS;
   key.kev_subclass = KEV_ANY_SUBCLASS;
   //
   int code = ioctl(s, SIOCSKEVFILT, &key);
   kern_event_msg msg;
   // endless loop
   while(1) {
        // get notification
        code = recv(s, &msg, sizeof(msg), 0);
        // check type of event
        switch(msg.event_code) {
           case KEV_DL_IF_DETACHED:
              // interface is detached
              break;
           case KEV_DL_IF_ATTACHED:
              // interface is attached
              break;
           case KEV_DL_LINK_OFF:
              // interface is turned off
              break;
           case KEV_DL_LINK_ON:
              // interface is turned on
              break;
        }
   }
   return 0;
}
于 2012-06-10T09:49:01.773 に答える