GNU/Linux >> Tutoriales Linux >  >> Linux

¿Obtener la velocidad del enlace mediante programación?

Necesitas usar el SIOCETHTOOL llamada ioctl(). Hay una buena introducción a la llamada ioctl/SIOCETHTOOL en LinuxJournal, y el código a continuación (que no pretende ser un ejemplo de buenas prácticas de C) debería mostrarle cómo usarlo para obtener la velocidad.

#include <stdio.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <linux/sockios.h>
#include <linux/if.h>
#include <linux/ethtool.h>
#include <string.h>
#include <stdlib.h>

int main (int argc, char **argv)
{
    int sock;
    struct ifreq ifr;
    struct ethtool_cmd edata;
    int rc;

    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (sock < 0) {
        perror("socket");
        exit(1);
    }

    strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
    ifr.ifr_data = &edata;

    edata.cmd = ETHTOOL_GSET;

    rc = ioctl(sock, SIOCETHTOOL, &ifr);
    if (rc < 0) {
        perror("ioctl");
        exit(1);
    }
    switch (ethtool_cmd_speed(&edata)) {
        case SPEED_10: printf("10Mbps\n"); break;
        case SPEED_100: printf("100Mbps\n"); break;
        case SPEED_1000: printf("1Gbps\n"); break;
        case SPEED_2500: printf("2.5Gbps\n"); break;
        case SPEED_10000: printf("10Gbps\n"); break;
        default: printf("Speed returned is %d\n", edata.speed);
    }

    return (0);
}

Puede obtener la velocidad del enlace en bits por segundo usando el sysfs interfaz:

cat /sys/class/net/eth0/speed
1000

Linux
  1. Documentación de ObjectRocket

  2. Obtenga la identificación del subproceso en Java

  3. Obtener la dirección IP de una interfaz en Linux

  4. ¿Cómo obtener información del proveedor y del producto USB mediante programación en Linux?

  5. ¿Cómo obtengo programáticamente el espacio libre en disco para un directorio en Linux?

Cómo comprobar la velocidad de enlace en Ubuntu 20.04

¿Tienes automatización? Aquí hay una guía rápida para ponerlo al día con Ansible

¿Cómo obtener el enlace del archivo para descargar con Wget?

¿Obtener programáticamente el id principal de otro proceso?

¿Cómo obtener la ruta al archivo actual (pwd) en Linux desde C?

Obtener nombres de funciones en una biblioteca compartida mediante programación