난 그냥이 같은 기능을 가지고 : 넷 링크를 사용하여 커널 공간에서 메시지를 수신에 사용되는리눅스 소켓 프로그래밍 디버그?
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 용 소켓을 만들려면 socket (PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 바인드하려면 구조체 sockaddr_nl 및 멤버 nl_family = AF_NETLINK가있는 주소를 지정해야합니다. –
예, 당신이 말한대로해야합니다. –
먼저 recvfrom하고 잘 작동하도록하십시오. 일단 당신의 소켓이 잘 작동하고 있다고 확신한다면 당신이 선택한 것을 – shodanex