「接続が拒否されました」というエラーが表示されるのは、ユーザーランドとカーネルランドプロセスが同じネットワークスペースに存在しないためです。カーネルランドプロセスは「ルート」空間をリッスンしていたのに対し、ユーザーランドプロセスは別の空間を送信していました。
COREはLinux仮想化を使用します。エミュレートされたノードごとに別々のプロセスとネットワークスペースが作成されます。アプリケーションがCOREノード上で実行されている場合、そのユーザーランドプロセスには独自のプロセスIDスペースとネットワークスタックスペースがあります。アプリケーションによって送信されたメッセージは、COREノード自身のスペース内に閉じ込められました。
COREを使用するときにカーネルとユーザーの通信を有効にするには、アプリケーションをカーネルのネットワークスペースに最初に切り替えてから、netlinkソケットを作成してソケットでメッセージを送信する必要があります。
カーネルのネットワークスペースに切り替えるには、最初に/proc
〜/proc_root
をマウントする必要があります。そして、アプリケーションでは、Netlinkを使用してkernel-landプロセスにメッセージを送信する前に{fd = open("/proc_root/1/ns/net", O_RDONLY); setns(fd, 0);}
を追加します。
こんにちはガルカ、私の質問にお答えいただきありがとうございます。私は約1年前にそれを公表しましたが、今私は解決策を見つけました。問題は、2つの通信プロセスが同じネットワークとプロセス空間に配置されている場合にのみ、カーネルとユーザー空間通信をサポートするNetlinkを使用したことでした。 COREノードは別々のネットワークとプロセス空間を使用するため、エラーが発生しました。私はCOREノードをカーネルスペースに切り替えようとしましたが、エラーはなくなりました。 :) – Tina
こんにちは、ティナ。どうしてあなたは答えを提出しなかったのですか?誰も不思議だった:) – galka
まあ、私はそれを知らなかった。次回はやるよ:) – Tina