我是 mac os x 的新手。我喜欢有一个线程来检测物理网卡链接打开/关闭事件,而不是外部可访问的 ip 网络。
我得到的旧方法是使用 select/timer 通过 ioctl 轮询接口标志...
有人有来自苹果的 API 的完整示例吗?像注册一个回调到内核并永远运行?如果有任何更改(linkup <--> kink down)会触发回调?
谢谢,
我是 mac os x 的新手。我喜欢有一个线程来检测物理网卡链接打开/关闭事件,而不是外部可访问的 ip 网络。
我得到的旧方法是使用 select/timer 通过 ioctl 轮询接口标志...
有人有来自苹果的 API 的完整示例吗?像注册一个回调到内核并永远运行?如果有任何更改(linkup <--> kink down)会触发回调?
谢谢,
尚未使用 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;
}