Windows Socket 接口简介
Windows Socket接口是Windows下网络编程的接口,在介绍Windows Socket接口之前,首先要简单介绍一下TCP/IP协议和描述网络系统架构的 OSI模型,以及TCP/IP模型 。
一般来说, 网络系统的架构可以用开放系统互联模型(OSI模型)来描述,OSI模型分层的思想类似于Windows等操作系统的分层, 在Windows下, 应用程序位于最高层,应用程序通过API调用位于中间层次的系统子程序, 系统子程序再调用驱动程序, 驱动程序最终操作计算机的硬件, 各层次之间的隔离有利于层次间的分工协作, 只要每个层次都严格遵守边界协定, 那么它对于其他层次来说就可以看成是一个 “ 黑匣子 “,结果就是开发人员能够致力于本层次的开发和提高,而不必担心能否和其他层次合作。与之类似, OSI模型的体系结构分为7层, 其中网络应用程序位于最高层, 通过多个层次最终控制网络硬件所在的物理层来收发数据包。
TCP/IP是Transmission Control Protocol/Internet Protocol (传输控制协议/网际协议)的缩写,它最初是在20世纪70年代初期由美国国防部出资为ARPA(美国高级研究项目局)开发的, 经过了多年以后,以TCP/IP 协议为基础构建的ARPA网逐步演变成了今天的 Internet。 TCP/IP网络的架构可以用TCP/IP模型来描述,这个模型和OSI模型极为相似,但是它将层次的划分减少到了4层,其每一层在功能上和OSI模型的一层或多层相对应,两种模型从工作原理上看并没有本质的区别。
图16.1描述了OSI模型和TCP/IP模型各层次之间的对应关系,并例举了部分在各层次上工作的网络协议,读者可以在其中看到很多熟悉的名词,如Telnet,HfTP,TCP和UDP等。

图16.l OSI模型、TCP/IP模型的结构和WinSock接口的关系
TCP/IP协议的核心协议运行于传输层和Internet层上, 主要包括TCP, UDP和IP协议, 其中TCP协议和UDP协议是以IP协议为基础而封装的,这两种协议提供了不同方式的数据通信服务。 在后面的16.2.3节中, 会对两种协议的区别做详细的介绍。如果说IP协议是道路, 那么下一层网络访问层的各种协议就相当于不同的铺路材料,而上一层的TCP和UDP 协议就相当于路上跑的不同类型的车辆; 再上层应用层的各种协议就相当于车上运送的丰富多彩的货物,它们都以TCP 和UDP 协议为载体来完成。比如,HTTP协议使用TCP协议传输网页, POP3协议使用TCP协议传输邮件, 而DNS协议使用UDP协议来传输域名和IP地址的翻译信息。
Microsoft为Win32环境下的网络编程提供了Windows Sockets接口(简称WinSock 接口), 正如Windows下的各种接口都是以API的形式出现的一样(如GDI), Win_Sock也是以一组API的方式提供的,从1991年推出1.0版开始,经过不断地完善后,WinSock接口现在已成为Windows下网络编程的标准。
由千网络协议最早是在UNIX 操作系统上实现的, 所以从可移植性考虑, WinSock 接口以BSD UNIX 操作系统中流行的Socket 接口为范例定义,它包含了UNIX Sockets 接口中一系列的同名函数,但是Windows 系统的运行方式和UNIX 系统有显著的不同,为了与Windows 系统相适应, WinSock 接在移植这些函数的同时对它们进行了改造, 并针对Windows 的消息驱动机制定义了一部分新的函数, 所以WinSock 接口函数实际上是UNIXSockets 接口函数的超集。
如图16.1 所示, WinSock 接口提供的函数位千TCP/IP 模型中的传输层和Internet 层上面, 也就是说, 我们可以利用接口函数编写使用TCP 和UDP 协议的程序, 也可以编写直接使用1P 协议的程序,如使用ICMP 协议完成Ping 的功能,但WinSock 接口并没有对应用层上的各种协议提供支持,所以应用程序无法通过WinSock 接口提供的函数来实现HTTP 、FTP与Telnet 等协议, 应用程序必须用另外的接口或者自己编程来实现这些高层协议。
与GDI 等接口类似, WinSock 接口也是通过几个动态链接库来提供的, 这些动态链接库从版本上分有1.1版本和2.0版本两种, 从位数分可以分为16 位版本和32 位版本, 如图16.2 所示, WinSock 接口函数的代码主要包括在WS2_32.dll 库文件中, 这个库文件提供了对2.0 版本WinSock 接口的支持。在早期的Windows 系统中, 16 位和32 位的1.1版本的文件名分别是WinSock.dll 和WSock32.dll, 为了给使用这些库文件的程序提供兼容性支持,系统中仍然存在这两个文件,只不过现在这两个文件中也是间接调用了WS2_32.dll 文件而已。
为了使用WinSock 接口,需要在源程序中包含对应的inc 和lib 文件,如果使用2.0 版本, 在源程序中必须包括WS2_32.inc 和WS2_32.lib 文件, 如果要使用的是1.1 版本的WinSock 函数, 那么既可以使用上面两个文件, 也可以使用WSock32.inc 和WSock32.lib文件。
在源文件中包含了对应的inc 文件和lib 文件后, 在使用其他WinSock 函数之前, 必须首先使用WSAStartup 函数来装入并初始化动态链接库, 否则对其他任何WinSock 函数的调用都不会成功, WSAStartup 函数只需要在程序开始的时候调用一次:
1 invoke WSAStartup,wVersionRequested,lpWSAData
2 .if eax
3 ;无法初始化WinSock库
4 .endif

图16.2 WinSock接口使用的动态链接库
wVersionRequested 是一个16 位的参数, 用来指定动态链接库将支持哪个版本的WinSock 函数, 其中的低8位指定主版本号, 高8位用来指定副版本号, 假如要使用1.1版的, 可以在这里使用0101h, 假如需要使用2.0版本函数, 则可以将参数指定为0002h。
lpWSAData 参数指向一个 WSADATA 结构, 用来返回动态链接库的详细信息, 结构的定义为:
WSADATA STRUCT
wVersion WORD ? ;库文件建议应用程序使用的版本
wHighVersion WORD ? ;库文件支持的最高WinSock 版本
szDescription BYTE WSADESCRIPTION_LEN + 1 dup (?);库描述字符串
szSystemStatus BYTE WSASYS_STATUS_LEN + 1 dup(?) ;系统状态字符串
iMaxSockets WORD ? ;同时支持的最大套接字数量
iMaxUdpDg WORD ? ; 2. 0 版中已废弃的字段
lpVendorinf o DWORD ? ; 2. 0 版中已废弃的字段
WSADATA ENDS
szDescription 字段中返回的字符串一般是"WinSock 2.0" 之类的库描述串,szSystemStatus 字段中返回的是类似于“ Running" 一类的运行状态字符串。如果库装入成功, 函数将返回0, 否则将返回下面的出错代码:
1 • WSASYSNOTREADY--网络子系统未准备好。
2 • WSA VERNOTSUPPORTED--不支持指定的版本。
3 • WSAEINPROGRESS--另一个阻塞方式的WinSock 1.1 操作正在进行中。
4 • WSAEPROCLIM--WinSock 接口已经到达了所支持的最大任务数。
5 • WSAEFAULT--输入参数lpWSAData 指定的指针无效。
不需要再使用WinSock 函数时, 比如, 在程序退出前, 必须使用WSACleanup 函数将库释放:
1 invoke WSACleanup
WSACleanup 函数没有输入参数, 它将释放动态链接库并自动释放所有被创建的套接字等资源。如果函数执行成功将返回O, 否则将返回SOCKET ERROR。
Windows Socket 接口简介的更多相关文章
- 高性能 Windows Socket 组件 HP-Socket v3.0.2 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- 高性能 Windows Socket 组件 HP-Socket v3.0.1 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- 高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-2 发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- 高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-1 发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- 高性能 Windows Socket 组件 HP-Socket v2.2.3 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- 通用高性能 Windows Socket 组件 HP-Socket v2.2.2 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解
最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...
- 转:Windows Socket五种I/O模型
原文转自: Windows Socket五种I/O模型 Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模 ...
- 【windows socket+TCPserverclient】
Windows Socket+TCPserverclient Winsock是 Windows下套接字标准. Socket套接字基于计算机网络,提供同一系统上不同进程或由局 ...
随机推荐
- Yii项目知识搜集
[['rId','advertiser_id','image_file'], 'unique','targetAttribute'=>['rId','advertiser_id','image_ ...
- Python3的单元测试模块Mock与性能测试模块CProfile
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_92 我们知道写完了代码需要自己跑一跑进行测试,一个写好的程序如果连测试都没有就上到生产环境是不敢想象的,这么做的人不是太自信就是太 ...
- react实战系列 —— react 的第一个组件
react 的第一个组件 写了 react 有一个半月,现在又有半个月没写了,感觉对其仍旧比较陌生. 本文分两部分,首先聊一下 react 的相关概念,然后不使用任何语法糖(包括 jsx)或可能隐藏底 ...
- 使用 Liquibase 管理数据库版本 - SpringBoot 2.7 .2 实战基础
优雅哥 SpringBoot 2.7 .2 实战基础 - 05 -使用 Liquibase 管理数据库版本 在企业开发中,数据库版本管理好像是一个伪命题,大多项目都是通过 Power Designer ...
- MySQL的三值逻辑
MySQL 采用三值逻辑 SELECT 1 = 1; SELECT 1 = 2; SELECT 1 = NULL; SELECT 1 != NULL; 上面四条语句的结果分别为: 可见MySQL采用三 ...
- 定制化JDK升级引发的离奇事件
1.背景 由于Oracle对外宣称Oracle JDK停止免费用于商用.公司法务部门评估之后担心后续会惹上光司,于是就开始了JDK升级-将所有服务Oracle修改为OpenJDK.上周开始微服务JDK ...
- python必备基础
1. 基础函数 序号 函数 说明 1 print() 打印 2 input() 输入 3 int() 转化为整形 4 float() 转化为浮点型 5 str() ...
- APICloud AVM框架 封装车牌号输入键盘组件
AVM(Application-View-Model)前端组件化开发模式基于标准Web Components组件化思想,提供包含虚拟DOM和Runtime的编程框架avm.js以及多端统一编译工具,完 ...
- Electron学习(四)之应用程序打包
highlight: a11y-dark 写在前面 人真的是会变得越来越懒的,也正是人的惰性吧,真的是很讽刺. 关于这个应用程序的开发,断更了很久,但是代码部分还算没落下吧,终于在周一.周二终把这个应 ...
- django_day10_项目相关
django_day10_项目相关 展示数据的方法 数据对象obj 普通字段 obj.字段名 ====> 数据库该字段的值 带choices参数的 obj.字段名 ====> 数据库该字段 ...