私はちょうどこのような機能を持っている:ネットリンクを使用してカーネル空間からのメッセージを受信するために使用されるLinuxソケットプログラミングのデバッグ?
static int
rcv_kern(int sock, void *buf, int len, struct sockaddr *addr,
socklen_t *addrlen)
{
struct timeval timeout = {1, 0};
fd_set set;
int status;
FD_SET(sock, &set);
if ((status = select(sock + 1, &set, NULL, NULL, &timeout)) == 0) {
FD_ZERO(&set);
fprintf(stderr,
"timeout while receiving answer from kernel\n");
exit(1);
} else if (status == -1) {
FD_ZERO(&set);
perror("recvfrom failed");
exit(1);
}
FD_ZERO(&set);
return recvfrom(sock, buf, len, 0, addr, addrlen);
}
を。しかし、私がそれを実行すると、結果は常に "ソースコードからの応答をカーネルから受け取っている間にタイムアウトする"というメッセージが表示されます。これは、 "select"メソッドが常に "0"を返すという理由によるものです。私はその理由を知らないが、誰が私に何か提案をすることができます、ありがとう。
おそらく、ソケットの作成方法に問題がありますか?ソケットにバインドしたのですか? netlink用のソケットを作成するには、ソケット(PF_NETLINK、SOCK_RAW、NETLINK_ROUTE)を使用する必要があります。バインドするには、構造体sockaddr_nlとメンバnl_family = AF_NETLINKを持つアドレスを指定する必要があります。 –
はい、私はあなたが言ったようにしています。 –
まず最初にrecvfromを行い、正常に動作させてください。あなたのソケットが正常に動作していることを確認したら、選択したものを実行してください – shodanex