前言

最近有个需求,所有本地海思的板子,都要能查询到他们的IP。如果是用串口调试,当然很容易知道IP,但是大部分情况下,我们还是用telnet远程连接,这时候,不知道IP就啥也干不了。

因此我想着在海思的板子上跑一个服务器程序,然后在本地运行客户端程序去查询,服务器接收到数据就将自己的IP返回给客户端,这样就知道所有海思芯片的IP了。

一开始是做了一个用TCP协议通信的,但是考虑到ABC三类IP加起来数量太多了,线程开太多,程序会把电脑卡死。然后又尝试了UDP广播,但是又不能做到跨网段,最终的解决方案是不使用C-S方式(客户端-服务器),而是采用对等连接方式P2P(peer to peer),在通信的时候,并不区分是服务器还是客户端,而是两台主机同时具有服务器和客户端的能力。并且发送信息的方式,都是往255.255.255.255广播,这样就能跨网段进行接收了。

本文档将所有码记录下来,并对关键点进行解释,方便以后查阅。

windows端所使用的线程API,是一个朋友封装的,文档中不提供代码,但是下载资源中可以找到

本文档资源地址:https://download.csdn.net/download/whitefish520/12831608

TCP方式

服务器

服务器端监听所有IP,并在客户端接入后,创建线程,发送自己的IP

//linux arm-hisiv500-linux-gcc server.c -o server -lpthread    #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<strings.h>
#include<ctype.h>
#include<stdlib.h>
#include<pthread.h>void *run(void *arg);
void trim(char *strIn, char *strOut);int main(){//lfd:socket返回的文件描述符,用lfd监听并接受客户端连接//cfd:客户端链接上来返回的cfd,用cfd和客户端通信int lfd,cfd;int opt = 1;char client_ip[256];//serv_addr服务器地址//client_addr客户端地址struct sockaddr_in serv_addr,client_addr;socklen_t client_len;pthread_t tid;    //socket创建服务器返回lfd文件描述符lfd = socket(AF_INET,SOCK_STREAM,0);setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));bzero(&serv_addr,sizeof(serv_addr));//ipv4serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(8080);serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//bindbind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));//监听是否有客户连接listen(lfd,256);while(1){client_len = sizeof(client_addr);//客户端地址长度//连接成功返回cfd,用cfd和客户通信cfd = accept(lfd,(struct sockaddr*)&client_addr,&client_len);printf("client:%s\t%d\n",inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,client_ip,sizeof(client_ip)),ntohs(client_addr.sin_port));//创建线程 回调 run方法  cfd做参数传入 pthread_create(&tid,NULL,run,(void *)cfd);  pthread_detach(tid);}return 0;
}
void *run(void *arg){int cfd = (int ) arg;char buf[1024];//缓冲区char ipbuf[1024];//缓冲区int len,i;char *pinfo;FILE *fp;while(1){system("ifconfig -a | grep 'inet addr' > ipinfo");  //获取ip并写入文件fp = fopen("ipinfo", "r");if (fp == NULL){printf("fopen error!\n");return;}while (!feof(fp)) { fgets(buf,1024,fp);  //从文件中一行一行读出数据if(!feof(fp)) {trim(buf, ipbuf);  //取出首尾的空格write(cfd,ipbuf,strlen(ipbuf));//发送给服务器}} fclose(fp);  system("rm ipinfo");  //发送完毕,删除ip信息文件break;}close(cfd);
}//实现去除首尾空格的效果
void trim(char *strIn, char *strOut)
{int i, j ;i = 0;j = strlen(strIn) - 1;while(strIn[i] == ' ')++i;while(strIn[j] == ' ')--j;strncpy(strOut, strIn + i , j - i + 1);strOut[j - i + 1] = '\0';
}

客户端

客户端程序做了对Windows的适配,需要Windows上安装MinGW gcc编译器,编译命令在注释中

客户端要求执行时输入一个参数,例如./client 192.168.10,注意只要三段,客户端会对1-255尝试连接,成功则创建线程,打印信息

//win32  gcc client.c pps_thread_win32.c -o client.exe  -lwsock32
//linux  gcc client.c -o client -lpthread   #ifdef _WIN32#include <stdio.h>#include <winsock2.h>#include "pps_thread.h"#pragma comment(lib,"ws2_32.lib")
#else#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>#include<sys/wait.h>
#endif#define DEST_PORT 8080//目标地址端口号
#define MAX_DATA 100//接收到的数据最大程度 char targetIP[32];
int stop = 0;void *run(void *arg)
{#ifdef _WIN32SOCKET sockfd;WSADATA wsaData;WORD wVersionRequired;wVersionRequired = MAKEWORD(2,2);if (WSAStartup(wVersionRequired, &wsaData)!= 0){printf("init failed %ld\n",WSAGetLastError());}
#elseint sockfd;
#endifint len,i;char serverIP[64];char endIP[256];int end = (int ) arg;sprintf(endIP, ".%d", end);strcpy(serverIP, targetIP);strcat(serverIP, endIP); struct sockaddr_in dest_addr;char buf[MAX_DATA];sockfd=socket(AF_INET,SOCK_STREAM,0);dest_addr.sin_family=AF_INET;dest_addr.sin_port=htons(DEST_PORT);dest_addr.sin_addr.s_addr=inet_addr(serverIP);memset(dest_addr.sin_zero, 0, 8);connect(sockfd,(struct sockaddr*)&dest_addr,sizeof(struct sockaddr));while(1){char buf[512] = "";
#ifdef _WIN32len = recv(sockfd, buf, sizeof(buf), 0);
#elselen = read(sockfd, buf, sizeof(buf));
#endifif(len<=0) continue;elseprintf("%s => %s",serverIP,buf);if(strcmp(serverIP, "192.168.10.255"))stop = 1;}
#ifdef _WIN32closesocket(sockfd);WSACleanup();
#elseclose(sockfd);
#endif
}int main(int argc,char** argv)
{int i = 0;
#ifdef _WIN32pps_thread_t tid;
#elsepthread_t tid;
#endifif(argc != 2){printf("This program is used for finding hisi board's IP\n");printf("For example, if your hisi board's IP is 192.168.10.x\n");printf("then you can run this progorm as ./client 192.168.10\n");printf("please run this progorm in cmd/powershell/terminal\n");getchar();return -1;}strcpy(targetIP, argv[1]);for(i=1;i<=255;i++){#ifdef _WIN32pps_thread_create(&tid,NULL,run,(void *)i);pps_thread_detach(tid);Sleep(8);
#elsepthread_create(&tid,NULL,run,(void *)i);pthread_detach(tid);usleep(8000);
#endif}while(1){if(stop) {printf("find over!  press any key to exit\n");getchar();return 0;}}return 0;
} 

UDP广播方式

基本思想是客户端向255.255.255.255广播一条信息,服务器接收任意IP,接收到广播后,对客户端返回自己的IP,客户端设置接收超时时间,超过时间后,认为已经扫码完毕,退出程序

这种方式有个缺陷,不能跨网段,即便是物理上连接到一起,但是网段不同就没法通信

服务器和客户端的程序和之前TCP的差别不大,主要是变成c++程序了,编译器要选用g++

服务器

//arm-hisiv500-linux-g++ server.c -o server -lpthread
#include <iostream>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
using namespace std;void trim(char *strIn, char *strOut);int main()
{int sockfd;struct sockaddr_in saddr;int r;FILE *fp;char buf[1024];//缓冲区char recvline[1025];char sendline[1024] = {"Hello"};struct sockaddr_in presaddr;socklen_t len = sizeof(presaddr);sockfd = socket(AF_INET, SOCK_DGRAM, 0);bzero(&saddr, sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_addr.s_addr = htonl(INADDR_ANY);saddr.sin_port = htons(8080);bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr));while (1){r = recvfrom(sockfd, recvline, sizeof(recvline), 0 , (struct sockaddr*)&presaddr, &len);if (r <= 0){perror("");exit(-1);}recvline[r] = 0;cout <<"recvfrom "<< inet_ntoa(presaddr.sin_addr) <<" " << recvline << endl;system("ifconfig -a | grep 'inet addr' > ipinfo");fp = fopen("ipinfo", "r");if (fp == NULL){printf("fopen error!\n");break;}while (!feof(fp)) { fgets(buf,1024,fp);  //读取一行if(!feof(fp)) {trim(buf, sendline);printf("%s",sendline);sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)&presaddr, sizeof(presaddr));}} fclose(fp);system("rm ipinfo"); }return 0;
}void trim(char *strIn, char *strOut)
{int i, j ;i = 0;j = strlen(strIn) - 1;while(strIn[i] == ' ')++i;while(strIn[j] == ' ')--j;strncpy(strOut, strIn + i , j - i + 1);strOut[j - i + 1] = '\0';
}

客户端

//linux  g++ client.c -o client -lpthread
//win32  g++ client.c pps_thread_win32.c -o client.exe  -lwsock32
#include <iostream>
#ifdef _WIN32#include <stdio.h>#include <winsock2.h>#include "pps_thread.h"#pragma comment(lib,"ws2_32.lib")
#else#include <strings.h>#include <string.h>#include <sys/types.h>     #include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <time.h>
#endif
using namespace std;#define DEST_PORT 8080//目标地址端口号 int stop = 0;void *run(void *arg)
{#ifdef _WIN32SOCKET sockfd;WSADATA wsaData;WORD wVersionRequired;wVersionRequired = MAKEWORD(2,2);if (WSAStartup(wVersionRequired, &wsaData)!= 0){printf("init failed %ld\n",WSAGetLastError());}const char on = 1;int timeout = 1000; //1000ms
#elseint sockfd;const int on = 1;struct timeval timeout;timeout.tv_sec=1;     //1stimeout.tv_usec=0;
#endifint ret;char recvline[1024];char sendline[1024] = {"Hello"};struct sockaddr_in des_addr;sockfd = socket(AF_INET, SOCK_DGRAM, 0);setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
#ifdef _WIN32setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); //接收超时检测
#elsesetsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); //接收超时检测
#endifmemset(&des_addr, 0, sizeof(des_addr));des_addr.sin_family = AF_INET;des_addr.sin_addr.s_addr = inet_addr((char *)arg); //广播地址des_addr.sin_port = htons(DEST_PORT);sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)&des_addr, sizeof(des_addr));while(1){memset(recvline, 0, sizeof(recvline));ret = recvfrom(sockfd, recvline, sizeof(recvline), 0, NULL, NULL);if(ret<=0) {stop = 1;break;}elsecout << "server IP => " << recvline;  }
#ifdef _WIN32closesocket(sockfd);WSACleanup();
#elseclose(sockfd);
#endif
}int main(int argc,char** argv)
{char targetIP[32];
#ifdef _WIN32pps_thread_t tid;
#elsepthread_t tid;
#endifsprintf(targetIP, "255.255.255.255");
#ifdef _WIN32pthread_create(&tid,NULL,run,(void *)targetIP);pps_thread_detach(tid);
#elsepthread_create(&tid,NULL,run,(void *)targetIP);pthread_detach(tid);
#endifwhile(1){if(stop) {printf("find over!  press any key to exit\n");getchar();return 0;}}return 0;
}

重头戏:跨网段的P2P连接的UDP广播

这种实现方式,服务器和客户端分别用了2个端口,服务器向18081端口发送广播,客户端在18081端口接收数据,客户端向18080端口发送广播,服务器在18080端口接收数据,也就是说,客户端先向255.255.255.255广播,服务器收到信息后,判断出有人想得到IP信息,又向255.255.255.255广播,客户端只会广播一次,服务器也只会广播一次,避免造成广播风暴,使得网络瘫痪

其实从本质上说,双方即使服务器,又是客户端,只不过为了方便表述,把后台运行的叫做服务器

重要设置

在嵌入式机器上,广播不一定发的出去,sendto函数返回-1,perror显示network is unreachable,这种情况下,需要添加路由

  • route add -net 255.255.255.255 netmask 255.255.255.255 dev eth0 metric 1
  • route add -host 255.255.255.255 dev eth0

这两种方式均可,具体原理本渣渣还不清楚

服务器

//arm-hisiv500-linux-g++ server.c -o server -lpthread
#include <iostream>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>#define SERVER_SEND_PORT 18081
#define SERVER_RECV_PORT 18080using namespace std;void trim(char *strIn, char *strOut)
{int i, j ;i = 0;j = strlen(strIn) - 1;while(strIn[i] == ' ')++i;while(strIn[j] == ' ')--j;strncpy(strOut, strIn + i , j - i + 1);strOut[j - i + 1] = '\0';
}void *run(void *arg)
{int ret = 0;FILE *fp;char buf[1024];char sendline[1024] = "test";int send_sockfd;const int on = 1;struct sockaddr_in send_saddr;send_sockfd = socket(AF_INET, SOCK_DGRAM, 0);setsockopt(send_sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));     //广播发送setsockopt(send_sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));bzero(&send_saddr, sizeof(send_saddr));send_saddr.sin_family = AF_INET;send_saddr.sin_addr.s_addr = inet_addr("255.255.255.255");send_saddr.sin_port = htons(SERVER_SEND_PORT);system("ifconfig -a | grep 'inet addr' > ipinfo");fp = fopen("ipinfo", "r");if (fp == NULL){printf("fopen error!\n");return NULL;}while (!feof(fp)) {    fgets(buf, 1024, fp);  //读取一行if(!feof(fp)) {trim(buf, sendline);ret = sendto(send_sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)&send_saddr, sizeof(send_saddr));cout << "read one line : " << sendline << endl;if(ret < 0)cout << "send error!" << endl;}    } fclose(fp);close(send_sockfd);system("rm ipinfo");
}int main()
{int ret = 0;int recv_sockfd;struct sockaddr_in recv_saddr, client_saddr;socklen_t len = sizeof(client_saddr);char recvline[1025];pthread_t tid;recv_sockfd = socket(AF_INET, SOCK_DGRAM, 0);bzero(&recv_saddr, sizeof(recv_saddr));recv_saddr.sin_family = AF_INET;recv_saddr.sin_addr.s_addr = htonl(INADDR_ANY);  //任意地址recv_saddr.sin_port = htons(SERVER_RECV_PORT);bind(recv_sockfd, (struct sockaddr*)&recv_saddr, sizeof(recv_saddr));while(1){ret = recvfrom(recv_sockfd, recvline, sizeof(recvline), 0 , (struct sockaddr*)&client_saddr, &len);if(ret > 0){recvline[ret] = '\0';cout <<"recvfrom "<< inet_ntoa(client_saddr.sin_addr) <<" " << recvline << endl;if(strcmp(recvline, "queryIP") == 0){pthread_create(&tid, NULL, run, NULL);pthread_detach(tid);}}}close(recv_sockfd);return 0;
}

客户端

//linux  g++ client.c -o client -lpthread
//win32  g++ client.c pps_thread_win32.c -o client.exe  -lwsock32
#include <iostream>
#ifdef _WIN32#include <stdio.h>#include <winsock2.h>#include <ws2tcpip.h>#include "pps_thread.h"#pragma comment(lib,"ws2_32.lib")
#else#include <strings.h>#include <string.h>#include <sys/types.h>     #include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <time.h>
#endifusing namespace std;#define CLIENT_SEND_PORT 18080
#define CLIENT_RECV_PORT 18081int main()
{int ret = 0;
#ifdef _WIN32SOCKET recv_sockfd, send_sockfd;WSADATA wsaData;WORD wVersionRequired;wVersionRequired = MAKEWORD(2,2);if (WSAStartup(wVersionRequired, &wsaData)!= 0){printf("init failed %ld\n",WSAGetLastError());}const char on = 1;int timeout = 3000;
#elseint recv_sockfd, send_sockfd;const int on = 1;struct timeval timeout;timeout.tv_sec=3; timeout.tv_usec=0;
#endifstruct sockaddr_in recv_saddr, client_saddr, send_saddr;socklen_t len = sizeof(client_saddr);char recvline[1025];char sendline[1024] = "queryIP";recv_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
#ifdef _WIN32setsockopt(recv_sockfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); //接收超时检测
#elsesetsockopt(recv_sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); //接收超时检测
#endifsetsockopt(recv_sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));memset(&recv_saddr, 0, sizeof(recv_saddr));recv_saddr.sin_family = AF_INET;recv_saddr.sin_addr.s_addr = htonl(INADDR_ANY);  //任意地址recv_saddr.sin_port = htons(CLIENT_RECV_PORT);bind(recv_sockfd, (struct sockaddr*)&recv_saddr, sizeof(recv_saddr));send_sockfd = socket(AF_INET, SOCK_DGRAM, 0);setsockopt(send_sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));  //广播发送setsockopt(send_sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));memset(&send_saddr, 0, sizeof(send_saddr));send_saddr.sin_family = AF_INET;send_saddr.sin_addr.s_addr = inet_addr("255.255.255.255");send_saddr.sin_port = htons(CLIENT_SEND_PORT);ret = sendto(send_sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)&send_saddr, sizeof(send_saddr));if(ret < 0)cout << "send error!" << endl;while(1){ret = recvfrom(recv_sockfd, recvline, sizeof(recvline), 0 , (struct sockaddr*)&client_saddr, &len);if(ret <= 0){cout << "query end, press any key to exit" << endl;
#ifdef _WIN32getchar();
#endifbreak;}else{recvline[ret] = '\0';cout << "server IP => " << recvline;}}
#ifdef _WIN32closesocket(recv_sockfd);closesocket(send_sockfd);WSACleanup();
#elseclose(recv_sockfd);close(send_sockfd);
#endif  return 0;
}

局域网内查询嵌入式设备IP的几种方式相关推荐

  1. 关于小米路由器的局域网内相互ping设备IP的解决方法

    1.今天调试intraweb时发现,不能访问设备IP,导致不能访问intraweb生成的网站.所以网上找了一下说是要把加密方式改一下,确实就正常了,很奇怪的现象呀,如果默认为混合加密WPA就ping不 ...

  2. 查询局域网内所有再用ip

    电脑的搜索框中搜索cmd点击运行,然后在cmd中运行如下命令. 1.查看本机电脑ip  cmd中运行命令:   ipconfig 2.查看局域网内所有在用ip 先运行命令: ipconfig/all ...

  3. ip-cmd-遍历局域网内联通的所有IP地址

    遍历局域网内联通的所有IP地址 save as ip.bat.cmd echo **********************************我是分割线********************* ...

  4. 局域网访问电脑上的html,Win10让局域网内其他电脑通过IP访问网站的方法

    最近,有位win10系统用户在电脑上制作好网站后,希望能让局域网内的其他电脑通过IP直接访问自己电脑的网站,以便得到更好地测试效果.可是,该用户操作了很久都没成功.那么,我们如何配置win10电脑的I ...

  5. widow10系统查找局域网网络计算机,Win10系统下让局域网内其他电脑通过IP访问自己电脑?...

    说起远程连接,恐怕许多朋友之前使用的都是采用启动QQ.再在QQ上打开远程协助的方法.诚然,这个方法比较易于上手,但前提是双方必须已经安装了QQ,而且都还要先启动QQ才行.相比之下,在最新版的 Win1 ...

  6. 局域网内共享数据库 - 固定IP

    局域网内共享数据库 - 固定IP 默认情况下,电脑开机时,路由器随机为其分配IP.特殊地,数据库程序中内置了IP地址,数据库电脑的IP需要固定 注意:这里的IP是指内网(局域网)IP,不是外网IP 方 ...

  7. 如何为计算机设置ip地上,如何给局域网内的电脑设置ip地址

    IP地址是互联网协议地址的简称,我们怎么设置局域网内计算机的ip地址呢?下面由学习啦小编为你整理了如何给局域网内的电脑设置ip地址的相关方法,希望对你有帮助! 局域网内电脑设置ip的方法和步骤如下 首 ...

  8. 嵌入式linux的运行过程,ARM嵌入式设备Linux系统启动步骤和方式

    > 1). 简介本文引用地址:http://www.eepw.com.cn/article/201607/294237.htm 本文简单介绍ARM嵌入式设备基于嵌入式Linux操作系统时候的启动 ...

  9. linux查看IP的几种方式;nmcli的使用

    目录 一:查询ip的几种方式: ip, ifconfig, nmcli,nmtui: 二:nmcli命令使用: a:在ens160网卡上新建连接static_con,并配置静态ip b:在ens160 ...

  10. 在外网访问内网电脑远程桌面的几种方式

    在外网连接内网电脑的远程桌面的方式大致有以下几种: 1.给内网电脑设定外网IP: 2.使用端口映射,将外网IP的某个端口映射到内部电脑的3389端口: 3.先连接到一台能同时访问外网和内网的电脑,然后 ...

最新文章

  1. 详解物联网的中间件:为何说它是不可或缺的?
  2. 【ExtJS】 布局Layout
  3. Ubuntu 14.04下安装ns-2.35详细教程
  4. pybind播放视频
  5. Algorithm:C++语言实现之链表相关算法(链表相加、链表的部分翻转、链表划分、链表去重、重复元素全部删除)
  6. BADI EXIT等增强报W警告类消息
  7. Unfair contest 模拟-分类讨论
  8. c、c++、Java和gcc写Hello World
  9. python中xlsxwriter_python xlsxwriter使用方法汇总
  10. 162. Find Peak Element
  11. 在Asp.net MVC使用jqGrid--代码少点再少点
  12. Windows Phone开发(16):样式和控件模板 转:http://blog.csdn.net/tcjiaan/article/details/7367260...
  13. UML2.0 学习笔记
  14. 快速上手!mysql数据恢复的方法
  15. Nginx 如何开启gzip 来提高页面加载速度
  16. 操作系统课程设计报告(文件系统)
  17. docker图形化监控容器资源使用情况【cadvisor和scope】
  18. mysql查询有什么意义_mysql分页查询有什么作用
  19. 2020年运营版双端直播盒子APP带引导安装 QQ微信一键登录+多级分销+粉色系列
  20. Kafka学习笔记 --- 生产者producer与消费者关系comsumer

热门文章

  1. win7搭建VM10虚拟机,搭建win7旗舰版64系统
  2. android 资源文件类型,命名规则(配置限定符名称),及其加载规则
  3. BurpSuite 安装配置(License Key)
  4. 小迪安全第10天 信息收集,资产监控拓展
  5. mysql加载audit失败_MySQL5.5 安装mcafee mysql-audit插件 不成功
  6. Photoshop-Camera Raw滤镜
  7. mysql删除表数据及其关联数据_MYSQL中delete删除多表数据与删除关联数据
  8. 提高多表关联数据查询效率
  9. Ubuntu连接WiFi开热点
  10. 数据结构 严蔚敏 第七章 查找 期末复习总结