c - 如何确定接口(interface)名称

标签 c sockets network-programming

我有一些代码可以发送带有 SOCK_RAW 套接字的 tcp 包。我的程序只有一个参数:主机名

这里是程序工作原理的描述:

getaddrinfo(argv[1], NULL, hints, &answ) //argv[1] it is host name
....
....
socket(tmp->ai_family, tmp->ai_socktype, tmp->ai_protocol) //tmp = answ->ai_next
....
....
/* filling the tcphdr struct */
send_frame->source = s_port;
send_frame->dest = d_port;
send_frame->seq = seq_num;
send_frame->ack_seq = ack_num;
send_frame->doff = 5;
send_frame->fin = 0;
send_frame->syn = 1;
send_frame->rst = 0;
send_frame->psh = 0;
send_frame->ack = 0;
send_frame->urg = 0;
send_frame->window = 0xffff;
send_frame->check = 0;
/* in this part I form a pseudo tcp header for checksum */
/* but for pseudo header i need a source ip address */
/* but I can not know before, what will be the source address */
/* and I can not form the pseudo header, because I do not know what my source address */
sendto(sock, send_frame, sizeof(struct tcphdr), 0, tmp->ai_addr, tmp->ai_addrlen);

在评论中,我解释了问题,要求清楚:我如何确定我的源 ip 地址,这将取决于我发送包的位置。我不想把我的设备的程序名称,它可能是 tun0 和 wlan0 和 My_Custom_Net_Interface_0012。是否有一个简单的机制来找到源地址,只知道目的地?

我立即想到有必要分析路由表,但我需要一种更简单的方法,如果有的话。

我找到了答案:

    connect(sock, tmp->ai_addr, tmp->ai_addrlen);
    struct sockaddr_in addr;
    socklen_t len = sizeof(struct sockaddr_in);
    getsockname(sock, (struct sockaddr *)&addr, &len);
    printf("%s\n", inet_ntoa(addr.sin_addr));

如果这个问题感兴趣,可以不加,如果不感兴趣,可以去掉

最佳答案

我找到了答案:

    connect(sock, tmp->ai_addr, tmp->ai_addrlen);
    struct sockaddr_in addr;
    socklen_t len = sizeof(struct sockaddr_in);
    getsockname(sock, (struct sockaddr *)&addr, &len);
    printf("%s\n", inet_ntoa(addr.sin_addr));

– 伊万·伊万诺维奇

关于c - 如何确定接口(interface)名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27412201/

相关文章:

c - 在C编程中达到EOF时如何退出stdin

c# - TCP连接丢失在C#中的问题

javascript - Java Server Socket 传输 String 到 web socket

android - 用户之间的实时挑战/响应

Java 以数据报包形式接收 Java 对象

c - C的算法可视化工具?

无法在 Linux 中创建僵尸进程

c - 注意: expected ‘struct filler’ but argument is of type ‘struct Info’

c - 为什么sin_addr在in_addr结构里面?

ajax - Mongolab 和网络延迟?