1、使用socket编程
通过创建一个简单的客户端-服务器模型,使用TCP或UDP协议监控网络连接的状态。可以定期发送ping
请求并记录响应时间。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SERVER_IP "8.8.8.8" // Google DNS
#define PORT 80
void check_connection() {
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("Socket creation failed");
return;
}
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);
if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
printf("Connection failed\n");
} else {
printf("Connected to %s:%d\n", SERVER_IP, PORT);
}
close(sock);
}
int main() {
check_connection();
return 0;
}
2、使用系统命令
调用系统命令(如ping
、tracert
等)并解析其输出。可以使用popen()
函数来执行命令并读取结果,监控目标主机的可达性和延迟。
#include <stdio.h>
#include <stdlib.h>
void check_connection() {
char command[50];
sprintf(command, "ping -c 4 8.8.8.8"); // Ping Google DNS
system(command);
}
int main() {
check_connection();
return 0;
}
3、基于libpcap库
使用libpcap
库捕获网络数据包,分析流量情况。可以编写程序过滤特定类型的流量,如HTTP、TCP等,来监控网络活动。
#include <stdio.h>
#include <pcap.h>
void packet_handler(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) {
printf("Captured a packet with length of [%d]\n", header->len);
}
void check_traffic() {
char *dev = pcap_lookupdev(NULL);
if (dev == NULL) {
perror("No suitable device found");
return;
}
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
if (handle == NULL) {
fprintf(stderr, "Could not open device %s: %s\n", dev, errbuf);
return;
}
pcap_loop(handle, 10, packet_handler, NULL);
pcap_close(handle);
}
int main() {
check_traffic();
return 0;
}
4、编译和运行
1)编译
gcc socket_monitor.c -o socket_monitor
gcc command_monitor.c -o command_monitor
gcc pcap_monitor.c -o pcap_monitor -lpcap
2)运行
./socket_monitor
./command_monitor
./pcap_monitor