3.2.1 InterfaceAddrRequest

 On Netlink++ application you simply include OZ++ netlink class header files as your needs, as shown below. You also have to write your own main function of the C/C++ program entry point.
The following InterfaceAddrRequest class is an example to send a NetlinkRequest for the structure ifaddrmsg to get IPv4 interface addresses.
Note:
1. Define your own netlink request C++ class.
2. Add a member variable of NetlinkRequest<T> which includes a netlink message header and a requst body of type T.
3. Add a member variable of SocketNetlink which can be used as a communication channel to the kernel.
4. Define a contructor to initialize the above two member variables.
5. Define a send method to send your netlink request to the kernel through the SocketNetlink.
6. Define a recv method to receive a reply from the kernel through the SocketNetlink.
7. In main function, create an instance of your request class, and call the send and recv mothods for the instance.




//
//InterfaceAddrRequest.cpp
//Copyright (c) 2014 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.


#include <oz++/CommonObject.h>
#include <oz++/Locale.h>
#include <oz++/Exception.h>

#include <oz++/netlink/SocketNetlink.h>
#include <oz++/netlink/SockAddrNetlink.h>
#include <oz++/netlink/InterfaceAddrAttribute.h>
#include <oz++/netlink/NetlinkMsgHeader.h>
#include <oz++/netlink/InterfaceAddrMsg.h>
#include <oz++/netlink/NetlinkRequest.h>

namespace OZ {
    
class InterfaceAddrRequest :public CommonObject {
private:
  NetlinkRequest<ifaddrmsg> request;
  SocketNetlink socketNetlink;

public:
  InterfaceAddrRequest(unsigned char family)
  {
    NetlinkMsgHeader header(&request.head);
    header.type(RTM_GETADDR);
    header.flags(NLM_F_ROOT|NLM_F_REQUEST);
    header.pid(getpid()); 

    InterfaceAddrMsg body(&request.body);
    body.family(family); 

    header.length( NLMSG_LENGTH(body.size()) );
  }
    
  ~InterfaceAddrRequest()
  {
    socketNetlink.close();      
  }
    
  int send()
  {
    return socketNetlink.send((const char*)&request, sizeof(request), 0);   
  }
    
  void recv()
  {
    while (true) {
      char buffer[4096];
      bzero(buffer, sizeof(buffer));
      int n = socketNetlink.recv(buffer, sizeof(buffer), 0);
      if (n < 0){
        break;;
      }
        
      NetlinkMsgHeader netlinkMsgHeader(buffer, n);
      if (netlinkMsgHeader.isDone() || netlinkMsgHeader.isError()) {
        break;
      }
      try {
        do {
          netlinkMsgHeader.display();
          InterfaceAddrMsg addrMsg(netlinkMsgHeader.data());

          InterfaceAddrAttribute attr(netlinkMsgHeader, addrMsg);
          do {
            attr.parse();
          } while (attr.next() );

          addrMsg.display();
          printf("\n");

        } while (netlinkMsgHeader.next());
      } catch (Exception& ex) {
        caught(ex);   
      }
      fflush(stdout);  
    } //while
  }
};
    
}


int main(int argc, char* argv[])
{
  Locale locale;
   
  try {
    InterfaceAddrRequest inetRequest(AF_INET);
    inetRequest.send();
    inetRequest.recv();
    
    InterfaceAddrRequest inet6Request(AF_INET6);
    inet6Request.send();
    inet6Request.recv();
    
  } catch (Exception& ex) {
    caught(ex);
  }
  return 0;
}



Last modified: 29 Aug 2016

 Last modified: 29 Aug2016

Copyright (c) 2000-2016 Antillia.com ALL RIGHTS RESERVED.