首页 > 所有文章 > 行业 >文章详情

delphi获取本地ip(delphi网络编程实例集锦)

时间:2024-02-13 14:01:40 浏览量:317

一、关于PF_INET和AF_INET的说明

AF 表示ADDRESS FAMILY 地址族

PF 表示PROTOCL FAMILY 协议族

windows中AF_INET与PF_INET完全一样

而在Unix/Linux系统中,在不同的版本中这两者有微小差别,对于BSD,是AF,对于POSIX是PF。

也就是说,我们创建TCP套接字,或者是UDP套接字,都可以使用PF_INET或者AF_INET,用哪一个都可以。

二、网络连接与通信的流程

使用WinSock API之前,必须加载一个版本的WinSock库,我们使用WSAStartup来进行WIndows Socket动态连接库的初始化,在整个程序结束时,要调用WSAClearup完成库的清理工作。这两个函数必须配套使用,在个在程序的开始,一个在程序的末尾。

SOCKADDR_IN结构。这个结构中,包括几个域,

1、协议族,当我们要使用面向连接的TCP协议族或者无连接的UDP协议族时,都应当选择互联网协议族,PF_INET或者AF_INET。

2、端口:关于端口,需要注意以下方面的内容。

我们在开发中,要遵循IANA网络编号分配认证:

0-1023端口 是IANA为固定服务保留的。21是FTP服务,80是HTTP服务等等。

1024-49151 是IANA列出的,已注册端口,供普通用户的普通用户进程和程序使用。

49152-65535 是动态的或者私用的端口。

对于我们填写的端口,比如5402端口,我们必须使用htons函数,把这个端口由主机字节顺序,转换成网络字节顺序。同样的,ntohs则是把网络字节顺序转换成主机字节顺序。类似的还有htonl和ntohl,这里面的s和l,分别是指短整数和长整数。

3、ip地址:我们通常用inet_addr函数把一个点式IP地址(例如:133.44.233.18)转换成为一个无符号的32位整数

inet_ntoa这个函数则把一个无符号32位整数的IP地址转换成标准的点式IP地址。

服务器端:

1、创建套接字,使用Socket()函数创建套接字,SOCK_STREAM是TCP套接字,SOCK_DRGAM是UDP套接字,根据实际的需要,来创建适合的套接字。

2、服务器端,要用Bind()函数,把第一步创建的套按字和相关的ip地址,端口绑定在一起。然后,调用Listen()建立起监听,准备接受连接。

3、调用Accept接受客户端的连接,每接受一个连接后,就会创建相对于这个连接的新的套接字,代表这个连接,这个套接字,将可以用于这个连接的通信。

4、调用Recv()和Send()在套接字上读取和写入数据,并循环,直到数据交换完成。

5、调用CloseSocket关闭当前用于读写数据的套接字。

6、调用CloseSocket关闭用于监听的套接字。

用于监听的套接字,只有一个,而用于连接的套接字,可能会有很多。

客户端:

1、和服务器端相同,使用Socket()函数创建套接字。

2、使用Connect()函数,用1中所创建的套接字连接远程主机。

3、使用Send/Recv函数在套接字上读写数据,直到数据交换完成。

4、使用CloseSocket()函数关闭套接字,结束连接。

需要说明的一点,客户端在整个连接过程中,一直使用的都是过程 1 中所创建的那个套接字。

三、异步选择模块和WSAAsyncSelect函数

WSAAsyncSelect模型允许应用程序以Windows消息的形式接收网络事件通知。

WSAAsyncSelect函数自动将套接字设置为非阻塞形式,并且为套接字绑定一个窗口句柄,当有网络事件发生时,便向这个窗口发送消息,函数定义如下:

int WSAAsyncSelect(

SOCKET s, //需要设置的套接字句柄

HWND hWnd, //指定的一个窗口句柄,套接字的通知消息将被发送到与其对应的窗口过程中

unsigned int wMsg, //网络事件到来接收到的消息ID,可以在WM_USER以上的数值中任意选择一个

long lEvent //指定哪些通知码需要发送,程序想要接收的网络消息的组合。

);

成功调用WSAAsyncSelect后,程序就会在发生网络事件时,给窗口发送相关的网络消息。消息中,对应的wParam参数指定发生网络事件的套接字句柄,lParam参数的低字位指定了发生的网络事件,高字位包含了任何可能出现的错误代码,可以使用WSAGetSelectError和WSAGetSelectEvent将这些信息取出,如果没有错误发生,出错代码为0,程序可以继续检查通知码,以确定发生的网络事件。