相关疑难解决方法(0)

使用C代码获取与ifconfig相同的信息

Linux中是否有一种方法可以使用C代码获取"ifconfig eth0"返回的相同信息?我对IP地址,链接状态和MAC地址等感兴趣.

这是ifconfig的示例输出:

eth0      Link encap:Ethernet  HWaddr 00:0F:20:CF:8B:42
          inet addr:217.149.127.10  Bcast:217.149.127.63  Mask:255.255.255.192
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2472694671 errors:1 dropped:0 overruns:0 frame:0
          TX packets:44641779 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1761467179 (1679.8 Mb)  TX bytes:2870928587 (2737.9 Mb)
          Interrupt:28 
Run Code Online (Sandbox Code Playgroud)

c linux networking

29
推荐指数
5
解决办法
6万
查看次数

在C中使用数据包模式时如何绑定到默认接口?

首先,我是socket编程的新手,所以我可能会遗漏一些明显的东西.

目标:

我正在尝试编写一个小工具来手工制作ARP帧并将其发送到线路上,然后收听回复.我正在使用AF_PACKET,SOCK_DGRAM,因此内核处理以太网头/尾部,但我在发送和接收时获得对帧的数据部分的原始访问.

该应用程序本质上是诊断性的,因此现有API和用户态工具不适用.我试图在广播域中找到响应ARP请求的一个(或多个)设备,但我并不关心填充系统ARP缓存或类似的东西.

题:

我希望用户能够按名称指定接口,或者使用适当的默认值.到目前为止,如果我指定接口,一切都很完美...但如果我不这样做,我不确定如何最好地处理bind()和sendto().

细节:

以下是相关代码的代表性示例.假设*cfg指向预先分配的结构,使用cfg-> interface.name =="eth0":

int  i;
int  sock;
void *buf;
struct my_config_options  *cfg;
struct ifreq  ifr;
struct sockaddr_ll  addr;
struct pollfd  pfd;


// Packet buffer
buf = malloc(BUF_LEN);

if (buf == NULL) {
    return 0;
}


// Open a socket
sock = socket(AF_PACKET, SOCK_DGRAM, 0);

if (sock_fd == -1) {
    return 0;
}


// Get interface index
strncpy(ifr.ifr_name, cfg->interface.name, IFNAMSIZ);

if (ioctl(sock, SIOCGIFINDEX, &ifr) == -1) {
    return 0;
}

cfg->interface.idx = ifr.ifr_ifindex;


// …
Run Code Online (Sandbox Code Playgroud)

c sockets linux

5
推荐指数
1
解决办法
237
查看次数

标签 统计

c ×2

linux ×2

networking ×1

sockets ×1