www.pudn.com > imp2.rar > imp2_u.c


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "imp2.h"

struct msg_to_kernel
{
  struct nlmsghdr hdr;
};

struct u_packet_info
{
  struct nlmsghdr hdr;
  struct packet_info icmp_info;
};

static int skfd;

static void sig_int(int signo)
{
  struct sockaddr_nl kpeer;
  struct msg_to_kernel message;

  memset(&kpeer, 0, sizeof(kpeer));
  kpeer.nl_family = AF_NETLINK;
  kpeer.nl_pid    = 0;
  kpeer.nl_groups = 0;

  memset(&message, 0, sizeof(message));
  message.hdr.nlmsg_len = NLMSG_LENGTH(0);
  message.hdr.nlmsg_flags = 0;
  message.hdr.nlmsg_type = IMP2_CLOSE;
  message.hdr.nlmsg_pid = getpid();

  sendto(skfd, &message, message.hdr.nlmsg_len, 0, (struct sockaddr *)(&kpeer),
         sizeof(kpeer));

  close(skfd);
  exit(0);
}

int main(void)
{
  struct sockaddr_nl local;
  struct sockaddr_nl kpeer;
  int kpeerlen;
  struct msg_to_kernel message;
  struct u_packet_info info;
  int sendlen = 0;
  int rcvlen = 0;
  struct in_addr addr;

  skfd = socket(PF_NETLINK, SOCK_RAW, NL_IMP2);
  if(skfd < 0)
    {
      printf("can not create a netlink socket\n");
      exit(0);
    }

  memset(&local, 0, sizeof(local));
  local.nl_family = AF_NETLINK;
  local.nl_pid = getpid();
  local.nl_groups = 0;
  if(bind(skfd, (struct sockaddr*)&local, sizeof(local)) != 0)
    {
      printf("bind() error\n");
      return -1;
    }

  signal(SIGINT, sig_int);

  memset(&kpeer, 0, sizeof(kpeer));
  kpeer.nl_family = AF_NETLINK;
  kpeer.nl_pid = 0;
  kpeer.nl_groups = 0;

  memset(&message, 0, sizeof(message));
  message.hdr.nlmsg_len = NLMSG_LENGTH(0);
  message.hdr.nlmsg_flags = 0;
  message.hdr.nlmsg_type = IMP2_U_PID;
  message.hdr.nlmsg_pid = local.nl_pid;

  sendto(skfd, &message, message.hdr.nlmsg_len, 0,
	 (struct sockaddr*)&kpeer, sizeof(kpeer));

  while(1)
    {
      kpeerlen = sizeof(struct sockaddr_nl);
      rcvlen = recvfrom(skfd, &info, sizeof(struct u_packet_info),
			0, (struct sockaddr*)&kpeer, &kpeerlen);

      addr.s_addr = info.icmp_info.src;
      printf("src: %s, ", inet_ntoa(addr));
      addr.s_addr = info.icmp_info.dest;
      printf("dest: %s\n", inet_ntoa(addr));
    }

  return 0;
}