C 代码实现双网卡数据转发:含 IP、MAC 解析与延时计算
以下是一个使用 C 语言实现的简单示例代码,用于在具有两块网卡的设备 B 上转发数据,同时打印一些相关信息。这只是一个基本的示例,实际的网络编程可能需要更复杂的错误处理和优化。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ether.h> #include <arpa/inet.h> #include <sys/time.h> // 定义网卡 1 的信息 #define CARD1_IP "192.168.137.51" #define CARD1_MAC "b2:71:fb:8f:3f:68" // 定义网卡 2 的信息 #define CARD2_IP "192.168.137.52" #define CARD2_MAC "00:11:22:33:44:55" // 请替换为实际的 MAC 地址 int main() { int sock1, sock2; struct sockaddr_in addr1, addr2; struct ether_header *eth_hdr; char buffer[1500]; int recv_len; struct timeval start, end; // 创建网卡 1 的套接字 if ((sock1 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("Failed to create socket for card 1"); return -1; } // 配置网卡 1 的地址信息 memset(&addr1, 0, sizeof(addr1)); addr1.sin_family = AF_INET; addr1.sin_addr.s_addr = inet_addr(CARD1_IP); addr1.sin_port = htons(5000); // 选择一个端口 // 绑定套接字到网卡 1 的地址 if (bind(sock1, (struct sockaddr *)&addr1, sizeof(addr1)) < 0) { perror("Failed to bind socket to card 1"); close(sock1); return -1; } // 创建网卡 2 的套接字 if ((sock2 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("Failed to create socket for card 2"); close(sock1); return -1; } // 配置网卡 2 的地址信息 memset(&addr2, 0, sizeof(addr2)); addr2.sin_family = AF_INET; addr2.sin_addr.s_addr = inet_addr(CARD2_IP); addr2.sin_port = htons(5000); // 与网卡 1 相同的端口 printf("Waiting for data on card 1...\n"); while (1) { // 记录数据到达网卡 1 的时间 gettimeofday(&start, NULL); // 接收数据 recv_len = recvfrom(sock1, buffer, sizeof(buffer), 0, NULL, NULL); if (recv_len < 0) { perror("Failed to receive data on card 1"); continue; } // 打印接收到的数据长度和源 IP 地址 printf("Received %d bytes from %s on card 1\n", recv_len, inet_ntoa(((struct sockaddr_in *) &addr1)->sin_addr)); // 记录数据准备发送到网卡 2 的时间 gettimeofday(&end, NULL); // 计算延时 long delay = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec); printf("Delay: %ld microseconds\n", delay); // 发送数据到网卡 2 if (sendto(sock2, buffer, recv_len, 0, (struct sockaddr *)&addr2, sizeof(addr2)) < 0) { perror("Failed to send data to card 2"); } } close(sock1); close(sock2); return 0; } ``` 这段代码创建了两个套接字,分别绑定到两块网卡的指定 IP 地址和端口。当从网卡 1 接收到数据时,计算数据到达的延时,并将数据转发到网卡 2 。 实际应用中可能需要更复杂的处理,例如处理不同的协议、错误情况和性能优化。MAC 地址的解析和处理可能需要更深入的知识和特定的库。 ######[AI写代码神器 | 1087点数解答 | 2024-11-01 14:16:39]
- 揭秘软件工程师视角:域名与 IP 一对多关系,一个 IP 能否对应多个域名? (百度文心 | 61点数解答 | 2023-11-09 18:19:12)375
- Python 实现 DES 加密算法编程实验:从原理到单步调试全解析(字节豆包 | 4096点数解答 | 2025-11-09 22:06:30)70
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- Java代码实现从JSON数据中提取ID,涉及“数据”与“项目 - 知识库”结构(字节豆包 | 603点数解答 | 2025-04-15 22:48:51)234
- C++ 实现:计算一排鹅与最高、最矮鹅的身高差及代码详解(字节豆包 | 549点数解答 | 2025-11-16 20:19:06)81
- 编程揭秘:计算 𝑛! 在 𝑃 进制下末尾零个数的方法与代码实现(DeepSeek | 549点数解答 | 2026-01-11 17:49:54)46
- Golang开发:解析JSON数据时数值默认类型及示例解析(百度文心 | 393点数解答 | 2023-11-09 18:13:06)274
- SQL Working Areas Sizing: Manual vs. Automatic Policy - A Comprehensive Analysis(阿里通义 | 530点数解答 | 2024-05-13 10:55:58)305
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)310
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)457
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)354
- C++ 代码实现自定义运算 x@y = x² + y² - xy 及 x@(x+y) 计算(DeepSeek | 215点数解答 | 2025-12-13 15:08:14)67