我正在开发一个客户端服务器应用程序。当我尝试获取服务器的 IP 地址时,它显示“null”

我正在开发一个客户端服务器应用程序。当我尝试获取服务器的 IP 地址时,它显示“null”

我尝试在我的大学实验室计算机上运行 client.c 和 server.c,运行时没有错误,但在我的计算机上运行时显示错误消息。我该如何解决这个问题???我使用 OracleVM VisualBox 和 Ubuntu 16.04(64 位)LTS

我想要获取服务器 IP 地址。

它显示 eth0:获取接口信息时出错:未找到设备

服务器IP地址:(空)

配置文件

enp0s3
链路封装:以太网 HWaddr 08:00:27:81:6e:cf

        inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
        inet6 addr:  fe80::3bf1:9b86:ba56:9c1d/64  Scope:Link
        UP BROADCAST RUNNING MULTICAST   MTU:1500  Metric:1
        RX packets:35963 errors:0 dropped:0 overruns:0 frame:0
        TX packets:10611 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueulen:1000
        RX bytes:39593069(39.5 MB)  TX bytes:933682 (933.6 KB)

lo
链路封装:本地环回

        inet addr:127.0.0.1  Mask:255.0.0.0
        inet6 addr: ::1/128 Scope:Host
        UP LOOPBACK RUNNING MTU:65536  Metric:1
        RX packerts:825 errors:0 dropped:0 overruns:0 frame:0
        TX packerts:825 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1
        RX bytes:77335 (77.3KB)   TX bytes:77335 (77.3KB)  

答案1

这更像是一个编程问题,而不是操作系统问题。最好将此问题连同相关源代码一起转发到 stackoverflow 上。

话虽如此。这就是你在任何 Linux 上迭代所有物理网络接口的方法。

#include <stdio.h>      
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h> 
#include <string.h> 
#include <arpa/inet.h>

int main (int argc, const char * argv[]) {
    struct ifaddrs * ifAddrStruct=NULL;
    struct ifaddrs * ifa=NULL;
    void * tmpAddrPtr=NULL;

    getifaddrs(&ifAddrStruct);

    for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
        if (!ifa->ifa_addr) {
            continue;
        }
        if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4
            // is a valid IP4 Address
            tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
            char addressBuffer[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
            printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); 
        } else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6
            // is a valid IP6 Address
            tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
            char addressBuffer[INET6_ADDRSTRLEN];
            inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
            printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); 
        } 
    }
    if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);
    return 0;
}

我的系统上的输出:

ppetraki@:tmp$ make net
cc     net.c   -o net
ppetraki@:tmp$ ./net
lo IP Address 127.0.0.1
br0 IP Address 10.1.0.12
virbr0 IP Address 192.168.122.1
lo IP Address ::1
eth7 IP Address fe80::56ee:75ff:fe6d:d29e
br0 IP Address fe80::56ee:75ff:fe6d:d29e

您可能更适合使用主机名和名称解析来获得更便携的客户端/服务器应用程序。祝你好运!

答案2

我不确定你的问题是什么。遗憾的是,你没有在 中提供网络接口的设置/etc/network/interfaces。也许你可以尝试打开 来查看 virtualbox 以太网设置virtualbox window > right click on virtual machine > settings > Network。确保启用网络适配器复选框被选中并选择所需的网络适配器。以太坊由于您从另一个虚拟机复制 Ubuntu,因此数字可能会发生变化。

相关内容