通过注册表获取或修改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. 学习笔记:Oracle的trace文件可见性

    隐藏参数: _trace_files_public 参数 trace文件的默认权限: - r w - r - - - - - 如果设定  trace_files_public参数为 true, 则 t ...

  2. Noip前的大抱佛脚----考场配置

    (global-linum-mode t) (global-set-key (kbd "RET") 'newline-and-indent) (setq default-tab-w ...

  3. Python_sklearn机器学习库学习笔记(七)the perceptron(感知器)

    一.感知器 感知器是Frank Rosenblatt在1957年就职于Cornell航空实验室时发明的,其灵感来自于对人脑的仿真,大脑是处理信息的神经元(neurons)细胞和链接神经元细胞进行信息传 ...

  4. 洛咕 P2155 [SDOI2008]沙拉公主的困惑

    洛咕 P2155 [SDOI2008]沙拉公主的困惑 有个结论,就是如果\(gcd(a,b)=1\),那么\(gcd(a+kb,b)=1\).证明比较显然. 所以这个题目要问的\(n!\)就可以分成\ ...

  5. Kafka系列三 java API操作

    使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

  6. 「功能笔记」Linux常用Shell命令(终端命令)备忘录

    长期更新,空置.缺漏的部分会逐渐补上.未指明时,均为GNU版本. 文件命令 基础操作 ls 默认显示非隐藏文件.以文件名进行排序.文件名有颜色(蓝色文件夹.白色一般文件.绿色可执行文件). Cheat ...

  7. 树莓派修改VNC分辨率

    1.打开终端输入 sudo raspi-config 2. 选择 Advanced Options  再选择 Resolution 3.选择想要的分辨率,确定 4.重启

  8. python3安装与环境配置和pip的基本使用

    本文环境 系统: Windows10 Python版本: 3.6 安装 python安装包下载 可以选择安装版和解压版 安装版一键安装, 安装过程注意选择安装位置, xx To Path选项(勾选), ...

  9. 0.0 配置JAVA环境和Maven环境(W10注意点)

    今天上班第一天,真有些忘了之前配置的环境问题,全新的电脑开始配置. 电脑软件JDK以及eclipse都是下载最新的 添加最全的链接吧: 1.JDK配置链接:http://www.cnblogs.com ...

  10. c++虚继承与虚函数

    学习继承与多态时看到这两个概念,记录整理. 虚继承与虚函数都是用virtual关键字实现,虚继承为了防止多重继承,而虚函数为了实现多态. 是几个例子. 虚继承: class A{}; class B: ...