<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://mit.spbau.ru/sewiki/index.php?action=history&amp;feed=atom&amp;title=SE_Wiki%2FLKP</id>
		<title>SE Wiki/LKP - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://mit.spbau.ru/sewiki/index.php?action=history&amp;feed=atom&amp;title=SE_Wiki%2FLKP"/>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=SE_Wiki/LKP&amp;action=history"/>
		<updated>2026-04-14T03:44:51Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=SE_Wiki/LKP&amp;diff=1225&amp;oldid=prev</id>
		<title>Aleksandr.kartashov: Новая страница: «=Linux Kernel programming=  ==Netlink==  Пример использования протокола Netlink из пространства пользователя П…»</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=SE_Wiki/LKP&amp;diff=1225&amp;oldid=prev"/>
				<updated>2012-03-28T11:48:40Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «=Linux Kernel programming=  ==Netlink==  Пример использования протокола Netlink из пространства пользователя П…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Linux Kernel programming=&lt;br /&gt;
&lt;br /&gt;
==Netlink==&lt;br /&gt;
&lt;br /&gt;
Пример использования протокола Netlink из пространства пользователя&lt;br /&gt;
Программа, получающая список сетевых интерфейсов через RtNetlink:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/netlink.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/rtnetlink.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// ================================================================================&lt;br /&gt;
&lt;br /&gt;
static char buf[10240];&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
  int nlsock;&lt;br /&gt;
  struct sockaddr_nl nla;&lt;br /&gt;
&lt;br /&gt;
  nlsock = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);&lt;br /&gt;
  if (nlsock &amp;lt; 0) {&lt;br /&gt;
    printf(&amp;quot;Failed to create a Netlink socket: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
    return 1;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  nla.nl_family = AF_NETLINK;&lt;br /&gt;
  nla.nl_pad = 0;&lt;br /&gt;
  nla.nl_pid = 0;&lt;br /&gt;
  nla.nl_groups = 0;&lt;br /&gt;
  if (connect(nlsock, (const struct sockaddr*)&amp;amp;nla, sizeof(nla)) &amp;lt; 0) {&lt;br /&gt;
    printf(&amp;quot;Failed to connect to the kernel rtnetlink: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
    goto close_sock;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  struct nlmsghdr* nlh = (struct nlmsghdr*)buf;&lt;br /&gt;
  nlh-&amp;gt;nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));&lt;br /&gt;
  nlh-&amp;gt;nlmsg_type = RTM_GETLINK;&lt;br /&gt;
  nlh-&amp;gt;nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;&lt;br /&gt;
  nlh-&amp;gt;nlmsg_seq = 0;&lt;br /&gt;
  nlh-&amp;gt;nlmsg_pid = getpid();&lt;br /&gt;
&lt;br /&gt;
  struct ifinfomsg* msg = (struct ifinfomsg*)NLMSG_DATA(nlh);&lt;br /&gt;
  msg-&amp;gt;ifi_family = AF_UNSPEC;&lt;br /&gt;
  msg-&amp;gt;ifi_index = 1;&lt;br /&gt;
  msg-&amp;gt;ifi_change = 0xFFFFFFFF;&lt;br /&gt;
&lt;br /&gt;
  if (send(nlsock, buf, nlh-&amp;gt;nlmsg_len, 0) &amp;lt; 0) {&lt;br /&gt;
    printf(&amp;quot;Failed to send a Netlink message: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
    goto close_sock;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  int sz = recv(nlsock, buf, sizeof(buf), 0);&lt;br /&gt;
&lt;br /&gt;
  while (NLMSG_OK(nlh, sz) &amp;amp;&amp;amp; nlh-&amp;gt;nlmsg_type != NLMSG_DONE) {&lt;br /&gt;
    if (nlh-&amp;gt;nlmsg_type &amp;amp; NLMSG_ERROR) {&lt;br /&gt;
      struct nlmsgerr* e = (struct nlmsgerr*)NLMSG_DATA(nlh);&lt;br /&gt;
      printf(&amp;quot;Failed to get a link: %d (%s)\n&amp;quot;, e-&amp;gt;error, strerror(-e-&amp;gt;error));&lt;br /&gt;
      goto close_sock;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (nlh-&amp;gt;nlmsg_type &amp;amp; RTM_NEWLINK) {&lt;br /&gt;
      struct rtattr* pattr;&lt;br /&gt;
      struct ifinfomsg* msg = (struct ifinfomsg*)NLMSG_DATA(nlh);&lt;br /&gt;
&lt;br /&gt;
      pattr = (struct rtattr*)(msg + 1);&lt;br /&gt;
      int alen = (char*)(nlh + nlh-&amp;gt;nlmsg_len) - (char*)pattr;&lt;br /&gt;
&lt;br /&gt;
      while (RTA_OK(pattr, alen)) {&lt;br /&gt;
        if (pattr-&amp;gt;rta_type == IFLA_IFNAME) {&lt;br /&gt;
          printf(&amp;quot;Interface %d, name %.*s\n&amp;quot;, msg-&amp;gt;ifi_index, RTA_PAYLOAD(pattr), RTA_DATA(pattr));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        pattr = RTA_NEXT(pattr, alen);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    nlh = NLMSG_NEXT(nlh, sz);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 close_sock:&lt;br /&gt;
  close(nlsock);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aleksandr.kartashov</name></author>	</entry>

	</feed>