3

我是 mac os x 的新手。我喜欢有一个线程来检测物理网卡链接打开/关闭事件,而不是外部可访问的 ip 网络。

我得到的旧方法是使用 select/timer 通过 ioctl 轮询接口标志...

有人有来自苹果的 API 的完整示例吗?像注册一个回调到内核并永远运行?如果有任何更改(linkup <--> kink down)会触发回调?

谢谢,

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 回答