开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 3891|回复: 20
打印 上一主题 下一主题
收起左侧

[易源码分享] [伪]IPV4/IPV6地址修改器

[复制链接]
结帖率:0% (0/1)
跳转到指定楼层
楼主
发表于 2022-5-29 19:02:09 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式   广西壮族自治区南宁市
分享源码
界面截图:
是否带模块: 调用了模块
备注说明: -
         

程序最开始是基于易语言论坛上的一个IP修改器来进行修改的,随后在慢慢的修改中增加了一些自己觉得缺少的功能,例如:多DNS选择、IP保存
目前查询了整个论坛都没有发现关于IPV6的读取,自己虽然找到IPV6地址信息在注册表中的位置,无奈注册表中所能看到的实在缺少,而目前可以读取IPV6地址的api,GetAdaptersAddresses,在论坛中也是几乎没有资料

所以这个程序可以这么说,更像是一个基于VC 2019而开发的易语言界面程序,核心读取部分为VC2019编写,界面显示部分为易语言

软件运行后通过释放位于图片资源里的GetAdaptersAddresses.exe(VC2019编写,源码可见帖子底部,也期待有人能把这部分代码转换成易语言版本),然后通过运行这个程序生成一个network.net的文件到系统temp目录下,随后软件通过读取这个network.net来显示IP信息,其中dns.db与iplist.db为xml结构文件,dns.db保存的是dns管理中公共DNS信息及自定义dns信息,iplist.db保存的是修改的ip地址信息

模块为云外归鸟的枚举对象模块,已包含在易语言源码压缩包中

易语言源码: Desktop.zip (835.91 KB, 下载次数: 87)

最后也附上VC2019部分源码:
[C++] 纯文本查看 复制代码
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <ws2tcpip.h>

// Link with Iphlpapi.lib
#pragma comment(lib, "IPHLPAPI.lib")
#pragma comment(lib, "Ws2_32.lib")

#define WORKING_BUFFER_SIZE 15000
#define MAX_TRIES 3

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

/* Note: could also use malloc() and free() */

int __cdecl main(int argc, char** argv)
{

    /* Declare and initialize variables */

    DWORD dwSize = 0;
    DWORD dwRetVal = 0;

    unsigned int i = 0;

    // Set the flags to pass to GetAdaptersAddresses
    ULONG flags = GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_INCLUDE_GATEWAYS;

    // default to unspecified address family (both)
    ULONG family = AF_UNSPEC;

    LPVOID lpMsgBuf = NULL;

    PIP_ADAPTER_ADDRESSES pAddresses = NULL;
    ULONG outBufLen = 0;
    ULONG Iterations = 0;

    PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
    PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
    PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
    PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
    IP_ADAPTER_DNS_SERVER_ADDRESS* pDnServer = NULL;
    IP_ADAPTER_PREFIX* pPrefix = NULL;

    const DWORD Size = 512;
    DWORD bufflen = Size;
    char buff[Size];
    char IP[130] ={0};
    char getway[130] = { 0 };
    char dhcpv6[130] = { 0 };
    char dhcpv4[130] = { 0 };

    if (argc != 2) {
        printf(" Usage: getadapteraddresses family\n");
        printf("        getadapteraddresses 4 (for IPv4)\n");
        printf("        getadapteraddresses 6 (for IPv6)\n");
        printf("        getadapteraddresses A (for both IPv4 and IPv6)\n");
        exit(1);
    }

    if (atoi(argv[1]) == 4)
        family = AF_INET;
    else if (atoi(argv[1]) == 6)
        family = AF_INET6;

    printf("Calling GetAdaptersAddresses function with family = ");
    if (family == AF_INET)
        printf("AF_INET\n");
    if (family == AF_INET6)
        printf("AF_INET6\n");
    if (family == AF_UNSPEC)
        printf("AF_UNSPEC\n\n");

    // Allocate a 15 KB buffer to start with.
    outBufLen = WORKING_BUFFER_SIZE;

    do {

        pAddresses = (IP_ADAPTER_ADDRESSES*)MALLOC(outBufLen);
        if (pAddresses == NULL) {
            printf
            ("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n");
            exit(1);
        }

        dwRetVal =
            GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);

        if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
            FREE(pAddresses);
            pAddresses = NULL;
        }
        else {
            break;
        }

        Iterations++;

    } while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (Iterations < MAX_TRIES));

    if (dwRetVal == NO_ERROR) {
        // If successful, output some information from the data we received
        pCurrAddresses = pAddresses;
        while (pCurrAddresses) {
            //printf("\tLength of the IP_ADAPTER_ADDRESS struct: %ld\n",
            //    pCurrAddresses->Length);
            //printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex);
            printf("\t[%s]\n", pCurrAddresses->AdapterName);
            //printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName);
            pUnicast = pCurrAddresses->FirstUnicastAddress;
            if (pUnicast != NULL) {
                int i = 0;
                while (pUnicast) {  
                    i++;
                    if (AF_INET == pUnicast->Address.lpSockaddr->sa_family) // IPV4 地址,使用 IPV4 转换
                    { 
                        inet_ntop(PF_INET, &((sockaddr_in*)pUnicast->Address.lpSockaddr)->sin_addr, IP, sizeof(IP));
                        printf("\tUnicast Addresses[%d]= %s\n",i ,IP);
                    }
                    else if (AF_INET6 == pUnicast->Address.lpSockaddr->sa_family) // IPV6 地址,使用 IPV6 转换
                    {
                        inet_ntop(PF_INET6, &((sockaddr_in6*)pUnicast->Address.lpSockaddr)->sin6_addr, IP, sizeof(IP));
                        printf("\tUnicast Addresses[%d]= %s\n",i, IP);
                    }
                    pUnicast = pUnicast->Next;
                }
                printf("\tNumber of Unicast Addresses= %d\n", i);
            }
            else
                printf("\tNo Unicast Addresses\n");

            pMulticast = pCurrAddresses->FirstMulticastAddress;
            if (pMulticast) {
                for (i = 0; pMulticast != NULL; i++)
                    pMulticast = pMulticast->Next;
                printf("\tNumber of Multicast Addresses: %d\n", i);
            }
            else
                printf("\tNo Multicast Addresses\n");

            pDnServer = pCurrAddresses->FirstDnsServerAddress;
            if (pDnServer != NULL) {
                int i = 0;
                while (pDnServer) {
                    i++;
                    if (AF_INET == pDnServer->Address.lpSockaddr->sa_family) // IPV4 地址,使用 IPV4 转换
                    {
                        inet_ntop(PF_INET, &((sockaddr_in*)pDnServer->Address.lpSockaddr)->sin_addr, IP, sizeof(IP));
                        printf("\tDNS Server Addresses[%d]= %s\n", i, IP);
                    }
                    else if (AF_INET6 == pDnServer->Address.lpSockaddr->sa_family) // IPV6 地址,使用 IPV6 转换
                    {
                        inet_ntop(PF_INET6, &((sockaddr_in6*)pDnServer->Address.lpSockaddr)->sin6_addr, IP, sizeof(IP));
                        printf("\tDNS Server Addresses[%d]= %s\n", i, IP);
                    }
                    pDnServer = pDnServer->Next;
                }

                printf("\tNumber of DNS Server Addresses= %d\n", i);
            }
            else
                printf("\tNo DNS Server Addresses\n");
            auto pGetway = pCurrAddresses->FirstGatewayAddress;
            while (pGetway) //网关
            {
                if (AF_INET == pGetway->Address.lpSockaddr->sa_family)
                    inet_ntop(PF_INET, &((sockaddr_in*)pGetway->Address.lpSockaddr)->sin_addr, getway, sizeof(getway));
                else if (AF_INET6 == pGetway->Address.lpSockaddr->sa_family)
                    inet_ntop(PF_INET6, &((sockaddr_in6*)pGetway->Address.lpSockaddr)->sin6_addr, getway, sizeof(getway));
                pGetway = pGetway->Next;
            }
            printf("\tGateway Addresses= %s\n", getway);

            //printf("\tDNS Suffix: %wS\n", pCurrAddresses->DnsSuffix);
            printf("\tDescription= %wS\n", pCurrAddresses->Description);
            printf("\tFriendly name= %wS\n", pCurrAddresses->FriendlyName);

            if (pCurrAddresses->PhysicalAddressLength != 0) {
                printf("\tPhysical address= ");
                for (i = 0; i < (int)pCurrAddresses->PhysicalAddressLength;
                    i++) {
                    if (i == (pCurrAddresses->PhysicalAddressLength - 1))
                        printf("%.2X\n",
                            (int)pCurrAddresses->PhysicalAddress);
                    else
                        printf("%.2X-",
                            (int)pCurrAddresses->PhysicalAddress);
                }
            }

            //printf("\tFlags: %ld\n", pCurrAddresses->Flags);
            printf("\tMtu: %lu\n", pCurrAddresses->Mtu);

            //接口类型
            switch(pCurrAddresses->IfType)
            {
                case MIB_IF_TYPE_ETHERNET:printf("\tIfType: %s\n", "以太网接口"); break;

                case MIB_IF_TYPE_PPP:printf("\tIfType: %s\n", "PPP接口"); break;

                case MIB_IF_TYPE_LOOPBACK:printf("\tIfType: %s\n", "软件环回接口"); break;

                case IF_TYPE_IEEE80211:printf("\tIfType: %s\n", "无线网络接口"); break;

            }
            printf("\tOperStatus: %ld\n", pCurrAddresses->OperStatus);
           // printf("\tIpv6IfIndex (IPv6 interface): %u\n",
            //    pCurrAddresses->Ipv6IfIndex);

            if (pCurrAddresses->Dhcpv6Server.lpSockaddr)//IPV6DHCP
            {
                if (AF_INET6 == pCurrAddresses->Dhcpv6Server.lpSockaddr->sa_family)
                {
                    inet_ntop(PF_INET6, &((sockaddr_in6*)pCurrAddresses->Dhcpv6Server.lpSockaddr)->sin6_addr, dhcpv6, sizeof(dhcpv6));
                }
            } 

            printf("\tDhcp IPv4 Enable= %lu\n", pCurrAddresses->Dhcpv4Enabled);
            printf("\tIPv6 Enable= %lu\n", pCurrAddresses->Ipv6Enabled);
            printf("\tIPv4 Enable= %lu\n", pCurrAddresses->Ipv4Enabled);
            printf("\tTransmit link speed= %I64u\n", pCurrAddresses->TransmitLinkSpeed);
            printf("\tReceive link speed= %I64u\n", pCurrAddresses->ReceiveLinkSpeed);

            //pPrefix = pCurrAddresses->FirstPrefix;
            //if (pPrefix) {
                //for (i = 0; pPrefix != NULL; i++)
                    //pPrefix = pPrefix->Next;
                //printf("\tNumber of IP Adapter Prefix entries: %d\n", i);
            //}
            //else
               // printf("\tNumber of IP Adapter Prefix entries: 0\n");

            printf("\n");

            pCurrAddresses = pCurrAddresses->Next;
        }
    }
    else {
        printf("Call to GetAdaptersAddresses failed with error: %d\n",
            dwRetVal);
        if (dwRetVal == ERROR_NO_DATA)
            printf("\tNo addresses were found for the requested parameters\n");
        else {

            if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                // Default language
                (LPTSTR)&lpMsgBuf, 0, NULL)) {
                printf("\tError: %s", lpMsgBuf);
                LocalFree(lpMsgBuf);
                if (pAddresses)
                    FREE(pAddresses);
                exit(1);
            }
        }
    }

    if (pAddresses) {
        FREE(pAddresses);
    }

    return 0;
}


评分

参与人数 3好评 +2 精币 +7 收起 理由
易语言资源网 + 1 + 3 开源精神必须支持~
冰点 + 1 + 3 支持开源~!感谢分享
Xiaochuzhang + 1 支持开源~!感谢分享

查看全部评分


结帖率:87% (41/47)
21
发表于 2022-11-29 12:47:11 | 只看该作者   河南省郑州市
感谢分享
回复 支持 反对

使用道具 举报

20
发表于 2022-11-19 06:00:37 | 只看该作者   河南省许昌市
收藏了        开源精神必须支持~
回复 支持 反对

使用道具 举报

结帖率:75% (3/4)
19
发表于 2022-7-2 12:43:55 | 只看该作者   广东省东莞市
为什么没有支持库了哦
回复 支持 反对

使用道具 举报

签到天数: 5 天

18
发表于 2022-6-11 21:23:09 | 只看该作者   广东省广州市
开源精神必须支持~
回复 支持 反对

使用道具 举报

结帖率:33% (1/3)
17
发表于 2022-6-5 15:26:28 | 只看该作者   江苏省南京市
需要这个!!
回复 支持 反对

使用道具 举报

签到天数: 7 天

16
发表于 2022-6-2 23:50:00 | 只看该作者   山东省潍坊市
开源精神必须支持~
回复 支持 反对

使用道具 举报

签到天数: 21 天

15
发表于 2022-5-31 09:07:01 | 只看该作者   上海市上海市
感谢分享
回复 支持 反对

使用道具 举报

14
发表于 2022-5-31 08:25:41 | 只看该作者   山东省济南市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 1 天

13
 楼主| 发表于 2022-5-31 07:14:36 | 只看该作者   广西壮族自治区南宁市
得意须尽欢 发表于 2022-5-30 19:32
请问一下这个最大的用处是啥

在需要频繁切换IP的环境下可以快速切换IP
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表