目的是这样的:希望往本地连接的IPv4地址发送组播信息。
本来好好的代码,换成笔记本后就收不到信息了。几经查找发现笔记本中存在很多个网络,包括蓝牙网络,本地连接,无线网络,还有两个vmware虚拟网络。大部分网络里面还有ipv4和ipv6地址。默认网络不是本地连接的ipv4地址。而我的代码里面写成了
mcast.imr_interface.s_addr = htonl(INADDR_ANY);选用了默认网络。
都不知道选成哪个网络了。
改成mcast.imr_interface.s_addr = inet_addr("192.168.20.181");就成功了。现在问题是如何自动在众多的网络中自动选择本地连接的IPv4网络呢?

解决方案 »

  1.   

    在网上搜索了一下,
    看见以下方法    gethostname(host_name, sizeof(host_name));
    printf("Host name is: %s\n", host_name);
    //从主机名数据库中得到对应的“主机”
    struct hostent *phe = gethostbyname(host_name);
    //循环得出本地机器所有IP地址
    for (int i = 0; phe->h_addr_list[i] != 0; ++i) 
    {
    struct in_addr addr;
    memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
    printf("Address %d : %s\n" , i, inet_ntoa(addr));
        }此程序可以列出所有的ipv4的地址,但仍然分不开哪个是本地连接,哪个是无线连接,哪个是虚拟网络。
    求教
      

  2.   

    在网上搜索了一下,找到以下方法:
        gethostname(host_name, sizeof(host_name));
    printf("Host name is: %s\n", host_name);
    //从主机名数据库中得到对应的“主机”
    struct hostent *phe = gethostbyname(host_name);
    //循环得出本地机器所有IP地址
    for (int i = 0; phe->h_addr_list[i] != 0; ++i) 
    {
    struct in_addr addr;
    memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
    printf("Address %d : %s\n" , i, inet_ntoa(addr));
        }此方法可以获取所有ipv4地址,但分不开哪个是本地连接,哪个是无线连接,哪个是虚拟网络。
    求教
      

  3.   

    有的网站上说用ipconfig /all保存到文件再处理。但是这个系统语言问题很麻烦,怎么去兼容英文,简体,繁体等不同的操作系统呢?另外,注册表的也不保证winXP和Win7,以及后续版本相同。