не биндится netlink socket [решено]
а вызов socket на ошибку проверял?
int fd;
if( ( fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE) ) < 0 ) return;
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <string.h>
#include <stdio.h>
int create_and_bind
{
int fd;
struct sockaddr_nl sa;
if( fd = socket( AF_NETLINK, SOCK_RAW, NETLINK_ROUTE ) < 0 )
{
perror("Cannot create netlink socket");
return -1;
}
memset( &sa, 0, sizeof( sa ) );
sa.nl_family = AF_NETLINK;
sa.nl_groups = RTMGRP_LINK;
sa.nl_pid = getpid;
if( bind( fd, ( struct sockaddr * ) &sa, sizeof( sa ) ) < 0 )
{
close( fd );
perror("Cannot bind netlink socket");
return -1;
}
return fd;
}
int main( void )
{
int fd;
fd = create_and_bind;
printf( "%d\n", fd );
close(fd);
fd = create_and_bind;
printf( "%d\n", fd );
close(fd);
return 0;
}
Вывод:
Cannot bind netlink socket: Socket operation on non-socket
-1
0
?!
if( fd = socket( AF_NETLINK, SOCK_RAW, NETLINK_ROUTE ) < 0 ) { ... }
Эквивалентно
if( fd = (socket( AF_NETLINK, SOCK_RAW, NETLINK_ROUTE ) < 0) ) { ... }
Эквивалентно (при условии, что socket(...) не фэйлится)
socket( AF_NETLINK, SOCK_RAW, NETLINK_ROUTE );
fd = 0;
Первым вызовом create_and_bind ты создаешь сокет (скорее всего с дескриптором 3 про который благополучно забываешь, и закрываешь stdin(#0).
Вторым вызовом ты создаешь сокет с дескриптором 0 (который освободился после закрытия stdin) и получаешь счастье.
спасибо!
в следующий раз сначала попробуй собрать с -Wall -Wextra -pedantic
что характерно, в третьем посте все написано правильно было.
Оставить комментарий
Sachaa
Привет!Создается сокет:
Потом, я хочу прослушивать на предмет появления\удаления интерфейсов:
И bind возвращает ошибку: ENOTSOCK. Мол, fd является дескриптором файла, а не сокетом.
Почему такое происходит и что с этим делать?