如何通过编程确定访问特定主机的路由网卡接口?
问题:编程确定发往指定远程IP的数据包对应的以太网接口
我希望通过编程确定发往指定远程IP的数据包将通过哪个以太网接口进行路由。
有提到可通过以下命令行方式查询路由:
# ip route show to match 8.8.8.8 default via 192.168.2.1 dev eth0
我想找到在C或C++中实现该功能的等效方法,已多方搜索但未找到合适方案,请问有什么建议?
编辑一
按照建议尝试了以下代码,但它始终返回0.0.0.0作为本地地址。
/* g++ -g -O0 getPortForAddr.cpp -o getPortForAddr */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <string.h> #include <iostream> int main(int argc, char **argv) { if (argc < 2) { printf("missing parameter\n"); exit(1); } const char *ipAddrStr = argv[1]; int fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd == -1) { perror("Socket failed"); exit(2); } // Try bind - doesn't work /* struct sockaddr_in serverAddr; serverAddr.sin_addr.s_addr = INADDR_ANY; serverAddr.sin_port = htons(1505); serverAddr.sin_family = AF_INET; if (bind(fd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) { perror("bind failed"); exit(3); } */ addrinfo hints; addrinfo *remAddrInfo; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_flags = AI_PASSIVE; hints.ai_family = AF_INET; hints.ai_socktype = SOCK_DGRAM; int rc = 0; if ((rc = getaddrinfo(ipAddrStr, 0, &hints, &remAddrInfo)) != 0) { std::cerr << "Failed to get address info:" << gai_strerror(rc) << std::endl; return 0; } struct sockaddr_in remoteAddr = *(struct sockaddr_in *)remAddrInfo->ai_addr; printf("Connect to %s\n", inet_ntoa(remoteAddr.sin_addr)); if (connect(fd, (struct sockaddr *) &remoteAddr, sizeof(struct sockaddr_in)) != 0) { perror("Connect failed: "); exit(3); } printf("connected\n"); // try sending some junk ssize_t bytesSent = send(fd, "abcd", 4, 0); if (bytesSent == -1) { perror("send failed; "); exit(3); } struct sockaddr_in localAddr; memset(&localAddr, 0, sizeof(localAddr)); socklen_t localAddrLen = 0; if (getsockname(fd, (sockaddr *)&localAddr, &localAddrLen) != 0) { perror("Failed to get local name: "); exit(3); } const char *ourAddr = inet_ntoa(localAddr.sin_addr); printf("OUR ADDRESS IS %s\n", ourAddr); }
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

