以下是一个使用 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 地址的解析和处理可能需要更深入的知识和特定的库。 [2024-11-01 14:16:39 | AI写代码神器 | 1087点数解答]