通过注册表获取或修改Ip

想到Windows会把系统网卡相关信息存入注册表,肯定可通过注册表读取具体ip信息。大致思路是找HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards ,由NetworkCards得分支表示各个网卡的信息通过ServiceName到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces 下找到对应的网卡配置详细信息,通过对注册表的read与write实现读取或修改ip地址等信息。

通过解析批处理命令结果获取

在cmd命令行输入ipconfig可以显示出当前电脑ip地址,可以考虑先执执行命令"Ipconfig /all >Ips.txt",然后解析Ips.txt文件得到本机的Ip信息,此方法较繁杂。

通过delphi控件获取Ip

找到fastnet 下的 Tpowersock控件,利用 该控件localip属性返回 本机(主要指局域网) ip地址 。 放一个控件在窗体上可得到本机IP,方便简单。

通过WinSock函数获取Ip

此方法在程序中常用,一般函数如下:

//多网卡 将IP地址写入到列表,求本机IP的话返回IP列表中的第一个即可,该函数要引用 WinSock

function GetLocalIpList(var IpList:TStringList):Integer;

type

TaPInAddr = array[0..10] of PInAddr;

PaPInAddr = ^TaPInAddr;

var

HostName: array [0..MAX_PATH] of char;

NameLen: Integer;

WSData: TWSAData;

lpHostEnt: PHostEnt;

I: Integer;

pptr: PaPInAddr;

begin

Result := 0;

if WSAStartup(MakeWord(2,0), WSData) <> 0 then Exit;

try

NameLen := sizeof(HostName);

fillchar(HostName, NameLen, 0);

NameLen := GetHostName(HostName, NameLen);

if NameLen = SOCKET_ERROR then Exit;

lpHostEnt := GetHostByName(HostName);

if lpHostEnt = Nil then Exit;

I := 0;

pPtr := PaPInAddr(lpHostEnt^.h_addr_list);

IpList.Clear;

while pPtr^[I] <> nil do

begin

IpList.ADD( inet_ntoa(pptr^[I]^));

Inc(I);

end;

Result := IpList.Count;

finally

WSACleanup;

end;

end;

该函数用到的主要Winsock方法有:

(1)WSAStartup,即WSA(Windows SocKNDs Asynchronous,Windows异步套接字)的启动命令。是Windows下的网络编程接口软件Winsock1 或 Winsock2 里面的一个命令(Ps:Winsock 是由Unix下的BSD Socket发展而来,是一个与网络协议无关的编程接口)。为了在应用程序当中调用任何一个Winsock API函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。函数定义如下:

  int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );wVersionRequested

  ⑴ wVersionRequested:一个WORD(双字节)型数值,指定了应用程序需要使用的Winsock规范的最高版本。高位字节指出副版本(修正)号,低位字节指明主版本号。

⑵lpWSAData 指向WSADATA数据结构的指针,用来接收Windows Sockets实现的细节。

本函数必须是应用程序或DLL调用的第一个Windows Sockets函数。它允许应用程序或DLL指明Windows Sockets API的版本号及获得特定Windows Sockets实现的细节。应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的Windows Sockets API函数。

  为支持日后可能和Windows Sockets 1.1有功能上差异的Windows Sockets实现及应用程序,在WSAStartup()中规定了一个协议。WSAStartup()的调用方和Windows Sockets DLL互相通知对方它们可以支持的最高版本,并且互相确认对方的最高版本是可接受的。在WSAStartup()函数的入口,Windows Sockets DLL检查了应用程序所需的版本。如果所需版本低于DLL支持的最高版本,则调用成功并且DLL在wHighVersion中返回它所支持的最高版本,在

  wVersion中返回它的高版本和wVersionRequested中的较小者。然后Windows Sockets DLL就会假设应用程序将使用wVersion.如果WSDATA结构中的wVersion域对调用方来说不可接收,它就应调用WSACleanup()函数并且要么去另一个Windows Sockets DLL中搜索,要么初始化失败。

  本协议允许Windows Sockets DLL和Windows Sockets应用程序共同支持一定范围的Windows Sockets版本。如果版本范围有重叠,应用程序就可以成功地使用Windows Sockets DLL。下列的图表给出了WSAStartup()在不同的应用程序和Windows Sockets DLL版本中是如何工作的:

  应用程序版本 DLL版本 wVersionRequested wVersion wHighVersion 最终结果

  1.1 1.1 1.1 1.1 1.1 use 1.1

  1.0 1.1 1.0 1.1 1.0 1.0 use 1.0

  1.0 1.0 1.1 1.0 1.0 1.1 use 1.0

  1.1 1.0 1.1 1.1 1.1 1.1 use 1.1

  1.1 1.0 1.1 1.0 1.0 失败

  1.0 1.1 1.0 -- -- WSAVERNOTSUPPORTED

  1.0 1.1 1.0 1.1 1.1 1.1 1.1 use 1.1

  1.1 2.0 1.1 2.0 1.1 1.1 use 1.1

2.0 1.1 2.0 1.1 1.1 失败

返回值:0 成功。否则返回下列的错误代码之一。注意通常依靠应用程序调用WSAGetLastError()机制获得的错误代码是不能使用的,因为Windows Sockets DLL可能没有建立"上一错误"信息储存的客户数据区域。

  关于Windows Sockets提供者的说明:

  每一个Windows Sockets应用程序必须在进行其它Windows Sockets API调用前进行WSAStartup()调用。这样,本函数就可以用于初始化的目的。

  进一步的说明在WSACleanup()的说明中有讨论。

错误代码

  WSASYSNOTREADY 指出网络通信依赖的网络子系统还没有准备好。

  WSAVERNOTSUPPORTED 所需的Windows Sockets API的版本未由特定的Windows Sockets实现提供。

WSAEINVAL 应用程序指出的Windows Sockets版本不被该DLL支持。

(2)WSACleanup函数

int WSACleanup (void);

应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。

WSAStartup应该与WSACleanup成对使用,WSAStartup的功能是初始化Winsock DLL,WSACleanup是来解除与Socket库的绑定并且释放Socket库所占用的系统资源。 在Windows下,Socket是以DLL的形式实现的。在DLL内部维持着一个计数器,只有第一次调用WSAStartup才真正装载DLL,以后的 调用只是简单的增加计数器,而WSACleanup函数的功能则刚好相反,每调用一次使计数器减1,当计数器减到0时,DLL就从内存中被卸载!因此,你 调用了多少次WSAStartup,就应相应的调用多少次的WSACleanup.

(3)gethostname()

  【函数原型】

int PASCAL FAR gethostname (char FAR * name, int namelen);

  【使用说明】

  该函数可以获取本地主机的主机名,其中:

  name:用于指向所获取的主机名的缓冲区的指针。

  Namelen:缓冲区的大小,以字节为单位。

返回值:若无错误,返回0;否则,返回错误代吗。

(4)gethostbyname()

  【函数原型】

struct hostent FAR * PASCAL FAR gethostbyname(const char FAR * name);

  【使用说明】

  该函数可以从主机名数据库中得到对应的"主机"。

  该函数唯一的参数name就是前面调用函数gethostname()得到的主机名。若无错误,刚返回一个指向hostent结构的指针,它可以标识一个"主机"列表。

Delphi 获取Ip地址的方法总结的更多相关文章

  1. js获取IP地址多种方法实例教程

    js获取IP地址方法总结   js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338. ...

  2. PHP获取IP地址的方法,防止伪造IP地址注入攻击

    PHP获取IP地址的方法 /** * 获取客户端IP地址 * <br />来源:ThinkPHP * <br />"X-FORWARDED-FOR" 是代理 ...

  3. js获取IP地址的方法小结

    s代码获取IP地址的三种方法,在js中取得客户端的IP地址. 原文地址:http://www.jbxue.com/article/11338.html 1,js取得IP地址的方法一 <scrip ...

  4. JavaScript和微信小程序获取IP地址的方法

    最近公司新加了一个需求,根据用户登录的IP地址判断是否重复登录,重复登录就进行逼退,那么怎么获取到浏览器的IP地址呢?最后发现搜狐提供了一个JS接口,可以通过它获取到客户端的IP. 接口地址如下: h ...

  5. asp.net获取ip地址的方法

    在ASP中使用 Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的I ...

  6. C++通过域名获取IP地址的方法;调试通过!

    BOOL GetIpByDomainName(][],int *nCount) { WSADATA wsaData; ]; HOSTENT *pHostEnt; ; struct sockaddr_i ...

  7. 正确JAVA从本机获取IP地址的方法

    https://www.cnblogs.com/xiaoBlog2016/p/7076230.html

  8. js获取IP地址方法总结_转

    js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338.html 1,js取得IP地址 ...

  9. js获取IP地址方法总结

    js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338.html 1,js取得IP地址 ...

随机推荐

  1. 2017战略No.1:坚定不移地走全产业链发展路线

    编者按:2016年9月9日,首次公开表达"我想走全产业链发展路线"的想法. 这几个月,认真思考了下这个决定背后的原因.目的和价值. 付出常人5倍以上的努力,先抓住"技术研 ...

  2. C#两个引用类的属性、方法 各位早安

    ***字符串.IndexOf("串"); - 返回字符串中第一个匹配项的索引,如果没有匹配项返回-1  intint b = s.IndexOf("天",s.I ...

  3. PLSQL_数据泵Datapump导入导出数据IMPDP / EXPDP(概念)(Oracle数据导入导出工具)(转)

    一.摘要 在平常备库和数据库迁移的时候,当遇到大的数据库的时候在用exp的时候往往是需要好几个小时,耗费大量时间.oracle10g以后可以用expdp来导出数据库花费的时间要远小于exp花费的时间, ...

  4. 【日常训练】Help Chef Gerasim(Codeforces 99B)

    题意与分析 需要注意非法情况.换言之,合法情况其实很苛刻. 代码 /* * ACM Code => cf99b.java * Written by Sam X * Date: 三月, 19, 2 ...

  5. 树莓派UPS-18650,添加时钟

    1.简介 UPS-18650 是一个专门为树莓派(以下简称 pi)所设计的 UPS 电源,采用两颗标准 的 18650 锂电池进行供电,支持外部电源插入检测,支持边充边放,既插上外部电源时, pi 由 ...

  6. 【转载】钉钉开发c#帮助类 获取用户信息 DingHelper.cs

    using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using Sys ...

  7. [环境配置]Ubuntu16.04下编译安装gcc6.3.0

    上一篇的SVS要用gcc6.3编译,否则结果不正确,本来以为gcc很好装,结果发现用apt-get安装gcc6只能安装6.5版本,代码作者奇特的要求只能用gcc6.3,没办法只能用源码装了,期间碰见了 ...

  8. 【HDU】3555【Bomb】

    题目链接 此题题意就是给你T个n,找出n以内的包含49的数的个数. 很裸的一题数位dp. 直接dp包含49的数的个数有点麻烦,所以我先算出不包含49的数的个数,然后用n+1来减(因为计算不包含49的数 ...

  9. 虚拟机中安装MAC OS X教程(适用所有电脑方法,特别是cpu不支持硬件虚拟化的电脑)

    前言 之前写了一篇在Windows上搭建Object-C开发环境,并且写了一个HelloWorld程序.但真正开发苹果软件是在MAC OS X系统中(以下简称OSX)中.买不起MacBook,也没有O ...

  10. 【文章存档】Azure Web 应用如何修改 IIS 配置

    链接 https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/aog-app-service-web-h ...