2

我正在使用 Lazarus IDE 在 Linux 系统上编写程序。该程序应该连接到 Internet 或 Intranet。所以,我想向用户显示他们可以用来连接到 Internet 或 Intranet(如 wifi)的所有可用网络连接的列表,如果系统上有两个活动的网卡,那么这个程序应该显示他们的可用连接。

目前,我不知道从哪里开始或使用什么工具。

任何提示、线索或建议将不胜感激。

4

2 回答 2

1

以下代码在我的 Linux 系统上运行。它输出所有可用的连接点,您可以通过这些连接点连接到 Internet 或 Intranet。我修改了代码以打印出它的名称和 IP 地址。

#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
// you may need to include other headers

int main()
{
   struct ifaddrs* interfaces = NULL;
   struct ifaddrs* temp_addr = NULL;
   int success;
   char *name;
   char *address;


  // retrieve the current interfaces - returns 0 on success
  success = getifaddrs(&interfaces);
  if (success == 0)
  {
     // Loop through linked list of interfaces
     temp_addr = interfaces;
     while (temp_addr != NULL)
     {
        if (temp_addr->ifa_addr->sa_family == AF_INET) // internetwork only
        {
            name = temp_addr->ifa_name;
            address = inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr);
        printf("%s %s\n",name,address);
        }

        temp_addr = temp_addr->ifa_next;
     }
  }

  // Free memory
  freeifaddrs(interfaces);
}
于 2013-11-18T19:28:37.503 回答
1

您可以使用 ifconfig 列出所有可用的网络接口及其状态。

编辑:要以编程方式执行此操作,您必须将函数 ioctl 与 SIOCGIFCONF 一起使用。

#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>

int main()
{
    int     sockfd, len, lastlen;
    char    *ptr, *buf;
    struct ifconf ifc;
    struct ifreq *ifr;
    char ifname[IFNAMSIZ + 1];
    char str[INET6_ADDRSTRLEN];

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    lastlen = 0;
    len = 100 * sizeof(struct ifreq);     /* initial buffer size guess */
    for ( ; ; )
    {
        buf = malloc(len);
        ifc.ifc_len = len;
        ifc.ifc_buf = buf;
        if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0)
        {
            if (errno != EINVAL || lastlen != 0)
                exit(-1);
        }
        else
        {
            if (ifc.ifc_len == lastlen)
                break;          /* success, len has not changed */
            lastlen = ifc.ifc_len;
        }

        len += 10 * sizeof(struct ifreq);     /* increment */
        free(buf);
    }

    printf("LEN: %d\n", ifc.ifc_len);

    for (ptr = buf; ptr < buf + ifc.ifc_len; )
    {
        ifr = (struct ifreq *) ptr;

        ptr += sizeof(struct ifreq); /* for next one in buffer */

        memcpy(ifname, ifr->ifr_name, IFNAMSIZ);

        printf("Interface name: %s\n", ifname);

        const char *res;

        switch (ifr->ifr_addr.sa_family)
        {
            case AF_INET6:
                res = inet_ntop(ifr->ifr_addr.sa_family, &(((struct sockaddr_in6 *)&ifr->ifr_addr)->sin6_addr), str, INET6_ADDRSTRLEN);
                break;
            case AF_INET:
                res = inet_ntop(ifr->ifr_addr.sa_family, &(((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr), str, INET_ADDRSTRLEN);
                break;
            default:
                printf("OTHER\n");
                str[0] = 0;
                res = 0;
        }

        if (res != 0)
        {
            printf("IP Address: %s\n", str);
        }
        else
        {
            printf("ERROR\n");
        }
    }

    return 0;
}

如果成功,ioctl SIOCGIFCONF 将返回一个结构 ifconf,它有一个指向结构 ifreq 数组的指针。这些结构在 net/if.h 中定义

使用此代码,从 ifc.ifc_req 可以获取所有接口,请查看 struct ifreq 的声明以确定每个数组元素的长度和类型。我想从这里你可以一个人继续,如果不是请告诉我。

于 2013-11-13T12:56:11.637 回答