私はnetlinkを使ってカーネルから割り込み番号を受け取ります。ユーザー空間のアプリケーションは、libeventを使用してTCP/IP要求を処理し、netlinkメッセージを処理します。 libevent Linux netlinkソケット?簡単な例がわかります。libeventはnetlinkソケットをサポートしています
0
A
答えて
1
はい、libeventはnetlinkソケットをサポートしています。
https://github.com/libevent/libevent/blob/master/sample/hello-world.cがあります。これは、netlinkソケットを受信するために以下で変更されています。
基本的な例は、Linuxネットワークインタフェースの作成/削除を待ち受けており、sudoを使って実行することで必要な特権を得ることができます。それはip monitor link
と同じイベントを聞きます。
libeventでRAWソケットをリッスンする別の例は、https://github.com/bodgit/libevent-natpmp/blob/master/natpmp.cです。
static void link_recvmsg(int fd, short event, void *arg)
{
char buf[NLMSG_SPACE(BUF_SIZE)] = {0};
socklen_t socklen;
struct iovec iov = {.iov_base = buf, .iov_len = sizeof(buf)};
struct sockaddr addr;
memset(&addr, 0, sizeof(struct sockaddr));
if (!fd || -1 == fd)
return;
int status = getsockname(fd, &addr, &socklen);
if(-1 == status)
return;
struct msghdr mh = {.msg_name = NULL, .msg_namelen = 0, .msg_iov = &iov, .msg_iovlen = 1,
.msg_flags = 0, .msg_name = &addr, .msg_namelen = sizeof(struct sockaddr)};
status = recvmsg(fd, &mh, 0);
if ((-1 == status) && ((EINTR == errno) || (EAGAIN == errno)))
return;
if(-1 == status)
return;
if ((mh.msg_flags & MSG_TRUNC) == MSG_TRUNC)
return;
if ((mh.msg_flags & MSG_CTRUNC) == MSG_CTRUNC)
return;
for (const struct nlmsghdr *h = (struct nlmsghdr *)buf; NLMSG_OK(h, status); h = NLMSG_NEXT(h, status)) {
switch (h->nlmsg_type) {
case RTM_NEWLINK:
fprintf(stderr, "got RTM_NEWLINK\n");
break;
case RTM_DELLINK:
fprintf(stderr, "got RTM_DELLINK\n");
break;
default:
fprintf(stderr, "unexpected case in swtch statement\n");
break;
}
}
}
int main(int argc, char **argv)
{
/* some init code here */
/* NETLINK socket */
int status;
int buf_size = BUF_SIZE;
struct sockaddr_nl src_addr;
int socket_nl = socket(AF_NETLINK, SOCK_RAW | SOCK_NONBLOCK, NETLINK_ROUTE);
if(-1 == socket_nl) return -1;
memset(&src_addr, 0, sizeof(struct sockaddr_nl));
src_addr.nl_family = AF_NETLINK;
src_addr.nl_pid = getpid();
src_addr.nl_groups |= RTNLGRP_LINK;
status = setsockopt(socket_nl, SOL_SOCKET, SO_RCVBUF,
&buf_size, sizeof(buf_size));
if(-1 == status) return -1;
status = bind(socket_nl, (struct sockaddr *)&src_addr, sizeof(struct sockaddr_nl));
if(status < 0) return -1;
static struct event nl_ev;
event_set(&nl_ev, socket_nl, EV_READ|EV_PERSIST, link_recvmsg,
NULL);
if (base) {
event_base_set(base, &nl_ev);
}
event_add(&nl_ev, NULL);
/* some other code, dispatch event and deinit */
}
関連する問題
- 1. boost :: asioを使用したAF_NETLINK(netlink)ソケット
- 2. 新しいネットリンクファミリでソケットnetlinkを使用する方法
- 3. libevent/libev:unixソケットを監視するCまたはC++
- 4. Windows Phone 7.1はSSLソケットをサポートしていますか?
- 5. Linux AIOはRAWソケットをサポートしていますか?
- 6. ActiveMQはセキュアなWebソケットをサポートしていますか?
- 7. TFSはカスタムWebソケットをサポートしていますか?
- 8. Netlinkソケットでカーネルのイベントを受け取る方法は?
- 9. C++:boost :: asio:write()はUDPソケットをサポートしていませんか?
- 10. TypeError: 'str'はバッファインターフェイスをサポートしていません - Python3ソケット
- 11. ユーザスペースnetlinkソケットは、カーネルスペースから空のメッセージを受け取ります
- 12. Netlinkソケットとlibnl - nl_recvmsgs_defaultが-16を返す(EBUSY)
- 13. どのブラウザプラグインがクロスドメインTCPソケットをサポートしていますか?
- 14. FireFoxはいつWebソケットをサポートしますか?
- 15. MongoDB:Windowsでunixソケットをサポートしていません
- 16. Libeventマルチスレッドサポート
- 17. libeventはパケットを受信したときに送信します
- 18. インストールされているlibeventのバージョンを確認するには?
- 19. netlinkソケットを使用してLinuxカーネルのユーザー空間アプリケーションと文字デバイス間で通信するときのエラー
- 20. socket.error:[Errno 102]ソケットで操作がサポートされていません
- 21. libeventのユーザトリガイベント
- 22. Broadcom NetLink BCM5906Mドライバ
- 23. FDTはマルチスレッドデバッグをサポートしています
- 24. InfluxDBはRestAPIをサポートしています
- 25. UWPはWRLをサポートしています
- 26. stimulsoftreports.netはスタイルタグをサポートしています
- 27. GCCはコマンドファイルをサポートしています
- 28. libspotifyはoauthをサポートしています
- 29. IEはJQueryをサポートしています
- 30. ServiceStackはWebソケットをサポートできますか?