⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imp2_u.c

📁 Linux 是一个源码开放的操作系统
💻 C
字号:
#include <unistd.h>#include <stdio.h>#include <linux/types.h>#include <string.h>#include <sys/socket.h>#include <arpa/inet.h>#include <asm/types.h>#include <linux/netlink.h>#include <signal.h>#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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -