浅谈Winsock与DLL技术

时间:2022-09-17 09:02:52

浅谈Winsock与DLL技术

[摘要]Microsoft公司以Berkeley Socket规范为规范,定义了一套Microsoft Windows下的网络编程接口,它不仅包含了人们很熟悉的Berkeley Socket风格的库函数,也包含了一组针对Windows的扩展库函数。文章主要对Winsock技术与DLL技术进行简单的介绍。

[关键词]Winsock;DLL;网络;主机信息

中图分类号:TP39 文献标识码:A 文章编号:1006-0278(2013)05-153-01

一、Winsock技术

(一)Winsock简介

Microsoft公司以Berkeley Socket规范为规范,定义了一套MicrosoftWindows下的网络编程接口,它不仅包含了人们很熟悉的Berkeley Socket风格的库函数,也包含了一组针对Windows的扩展库函数。程序员能充分利用Windows消息驱动机制进行编程。Windows Socket规范本意在于提供给应用程序开发者一套简单的API,并让各网络软件供应商共同遵守。此外,在一个特定版本Windows的基础上,WindowsSocket规范也定义了一个二进制接口(ABI),并通过此二进制接口来保证其兼容性。因此这份规范定义了应用程序开发者能够使用,而且网络软件供应商也能够实现的一套函数调用和相关语义。

(二)Wmsock工作原理

要利用互联网进行通信,至少需要一对套接字。其中一个运行于客户机端,称之为Client socket,另一个运行于服务器端,称之为Server socket。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:

1.服务器监听,是指服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时信息采集网络状态。

2.客户端请求,是指由客户端的套接字提出连接,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3.连接确认,是指当服务器端套接字监听到或者接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立成功。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

二、DLL技术

(一)DLL简介

动态链接库是Windows操作系统最重要的组成要素之一。其中Keme132.dll、user32.dll、和system.dry等以dll、dry、sys和许多以.exe为扩展名的动态链接库模块构成了Windows操作系统的核心。这些动态链接库包含有服务函数、全局数据和资源,在运行时能够被系统自动加载到进程的地址空间中,成为调用进程的一部分。如果和其他DLL没有冲突,此模块将被映射到进程地址空间的同一地址上。DLL模块包含有各种导出函数,用于向外界提供服务。在Win32环境中,每个进程都复制了自己的读/写全局变量。如果想要与其他进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。Windows在加载DLL模块时将进出函数调用与DLL文件的导出函数相匹配。Windows操作系统对DLL的操作仅仅是把DLL映射到需要它的进程空间的虚拟地址空间里去。DLL函数中的代码所创建的任何对象(包括变量名)都归调用它的进程或线程所有。

一个DLL的在内存中只有一个实例,可以为当前操作系统的多个应用程序所共享。DLL很好的实现了对代码的封装,在创建可执行模块时并不需要公开其源代码。DLL的制作与具体的编程语言及编译器无关,因此可以充分发挥多种编程语言的优势,使程序设计人员能够以最适合的语言完成对某个模块的设计。在设计比较大的应用程序时,一般将其划分为多个模块,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题。

(二)DLL的调用方式

DLL的调用方式有静态调用和动态调用两种。其中,静态调用方式由编译系统完成对DLL加载、卸载的编码。动态调用方式则是程序设计人员通过使用API函数来完成对DLL的加载与卸载。

在使用静态调用方式时,需要将生产动态链接库时产生的HB文件添加到应用程序工程中,对要使用的DLL中函数,只需要声明一下即可。在程序员以静态调用方式编译生成应用程序时,应用程序中的调用函数将与LIB文件中的导出符号相匹配,这些符号或标识号进入到新生成的可执行文件中。LIB文件中包含了对应的DLL文件名(不是绝对路径),链接程序将其存储在可执行文件内。一旦应用程序需要加载DLL文件,操作系统将根据此信息发现并加载DLL,并通过符号名或标识号实现对DLL函数的动态链接。所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载到内存中。可执行程序链接到一个DLL输出函数信息的输入文件库(LIB)。操作系统在加载使用可执行程序的同时加载相应的动态链接库,由可执行程序直接通过函数名来调用DLL的各个输出函数,其调用方法与调用位于程序内部的其他函数是一样的。

在进行动态调用时,应用程序使用LoadLibraryO或C提供的AfxLoadLibraryO函数显示加载动态链接库,以DLL文件名作为函数的参数,再用GetProcAddressO函数获取想要引入的函数。自此,就可以像使用应用程序内部函数一样来调用此引入函数了。在应用程序推出之前,需要用Free LibraryO或MFC提供的AfxFreeLibraryO函数显示卸载动态链接库。由于动态调用完全是通过代码显示进行,因此,程序员可以决定DLL文件加载或不加载,以及在运行时决定加载哪个DLL文件。在使用DLL的程序之前必须成功加载DLL获得一个DLL模块句柄,并调用GetProcAddressO函数将符号名或标识号转换为DLL内部地址。动态调用方式对于集成化的开发语言(如VC++)比较适合。

上一篇:浅谈计算机科学及其应用 下一篇:厚钢板焊接工艺在土木工程施工中的应用介绍