You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程确定访问特定主机的路由网卡接口?

问题:编程确定发往指定远程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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:19:57