char buffer[100];
iov.iov_base = buffer;
iov.iov_len = sizeof ( buffer );
ssize_t length;
bool done = false;
while ( true ) {
length = recvmsg ( socket_fd, &messages, 0 );
if ( length == -1 ) {
return false;
} else if ( length == 0 ) {
break;
}
struct nlmsghdr * message;
for ( message = ( struct nlmsghdr * ) buffer; NLMSG_OK ( message, length ); message = NLMSG_NEXT ( message, length ) ) {
switch ( message->nlmsg_type ) {
case NLMSG_DONE:
printf ( "%s\n", "done" );
done = true;
break;
default:
printf ( "code %d\n", message->nlmsg_type );
break;
}
}
if ( done ) {
break;
}
}
используя метод научного тыка находим:
- 20 <= размер буфера < 68 - прочитан done
- 68 <= размер буфера < 148 - прочитано одно сообщение и done
- 148 <= размер буфера < inf - прочитано два сообщения и done
вот это прикол. зачем он отбрасывает нужные сообщения. почему оно не кидает ошибку EMSGSIZE. идем в ман:
Если сообщение слишком длинное и не поместилось в предоставленный буфер, лишние байты могут быть отброшены, в зависимости от типа сокета, на котором принимаются сообщения.
для netlink доступно 2 варианта создания сокетов:
socket ( AF_NETLINK, SOCK_RAW, NETLINK_ROUTE )
socket ( AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE )
я же не ванга. откуда я узнаю сколько сообщений мне придет?
Огромные фиксированные буферы - не хочу. Читать обычным read-ом?