не биндится netlink socket [решено]

Sachaa

Привет!
Создается сокет:
int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);

Потом, я хочу прослушивать на предмет появления\удаления интерфейсов:
           
struct sockaddr_nl sa;

memset(&sa, 0, sizeof(sa;
sa.nl_family = AF_NETLINK;
sa.nl_groups = RTMGRP_LINK;

bind(fd, (struct sockaddr *) &sa, sizeof(sa;

И bind возвращает ошибку: ENOTSOCK. Мол, fd является дескриптором файла, а не сокетом.
Почему такое происходит и что с этим делать?

Marinavo_0507

а вызов socket на ошибку проверял?

Sachaa

Да:

int fd;
if( ( fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE) ) < 0 ) return;

Sachaa

Ситуация стала еще интересней:

#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

?!

Lexa111

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) и получаешь счастье.

Sachaa

спасибо! :)

vall

в следующий раз сначала попробуй собрать с -Wall -Wextra -pedantic

fufa58

что характерно, в третьем посте все написано правильно было.
Оставить комментарий
Имя или ник:
Комментарий: