Presentation is loading. Please wait.

Presentation is loading. Please wait.

网络编程技术 设计、制作:谭献海 Email:xhtan@home.swjtu.edu.cn.

Similar presentations


Presentation on theme: "网络编程技术 设计、制作:谭献海 Email:xhtan@home.swjtu.edu.cn."— Presentation transcript:

1 网络编程技术 设计、制作:谭献海

2 Winsock 一、  Winsock概述 Windows下网络编程的规范-Windows Sockets是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。 Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Micosoft Windows下网络编程接口。它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。 winsock有开发组件和运行组件二大部分,开发组件是供开发应用程序使用,包括定义的宏常数值、数据结构和函数调用接口原型。运行组件是winsock应用程序接口的动态链接库—winsock.DLL,应用程序在执行时通过装入DLL实现网络通信功能。

3 winsock 应用程序调用Windows Sockets的API实现相互之间的通讯。Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。它们之间的关系如图1-1。 应用程序1 应用程序2 网络编程接口winsock 网络通信协议服务接口TCP/IP 操作系统 windows 物理通信介质 图1-1 winsock所处的位置

4 Windows 平台支持的Winsock 最新版本
采用Winsock 1的应用必须有Winsock.h 头文件 使用Winsock 2的应用需要Winsock2.h 头文件。

5 WSAStartup (初始化Windows Sockets API)
WInsock2 的起始与结束 WSAStartup (初始化Windows Sockets API) 应用程序 WSACleanup (释放所使用的Windows Sockets DLL)

6 Winsock 二、 Winsock提供的函数调用 Windows Socket 1.1库函数概览
Windows Socket 1.1库函数概览 2.1 基本套接口函数  Windows Sockets规范包含了以下30个Berkeley风格的套接口例程:  *表示例程在应用于阻塞套接口时会阻塞。

7 基本套接口函数 socket() 创建一个通讯端点并返回一个套接口。 bind() 把一个本地名字和一个无名的套接口捆绑起。
Listen() accept()* 响应联结请求,并且新建一个套接口。原来的套接口则返回监听状态。 connect()* 初始化到一个指定套接口上的连接 getpeername() 得到连接在指定套接口上的对等通讯方的名字。 getsockname() 得到指定套接口上当前的名字。 getsockopt() 得到与指定套接口相关的属性选项。

8 基本套接口函数 recv()* 从一个已连接的套接口接收数据。 recvfrom()* 从一个已连接的或未连接的套接口接收数据。
send()* 从一已连接的套接口发送数据。 sendto()* 从已连接或未连接的套接口发送数据。 select()* 执行同步I/O多路复用。 setsockopt() 设置与指定套接口相关的属性选项。 Close() shutdown() 关闭一部分全双工的连接。

9 基本套接口函数 htonl() 把32位的数字从主机字节顺序转换到网络字节顺序。
htons() 把16位的数字从主机字节顺序转换到网络字节顺序。 inet_addr() 把一个Internet标准的"."记号地址转换成Internet地址数值。 inet_ntoa() 把Internet地址数值转换成带"."的ASCII字符串。 ioctlsocket() 为套接口提供控制。 listen() 监听某一指定套接口上连接请求的到来。 ntohl() 把32位数字从网络字节顺序转换为主机字节顺序。 ntons() 把16位数字从网络字节顺序转换为主机字节顺序。 *表示例程在应用于阻塞套接口时会阻塞。

10 数据库函数 2.2 数据库函数 Windows Sockets规范定义了如下数据库函数:
gethostbyaddr()*   从网络地址得到对应的名字(有可能多个)和地址。 gethostbyname()*   从主机名得到对应的名字(有可能多个)和地址。 gethostname()      得到本地主机名。 getprotobyname()*   从协议名得到对应的协议名和协议号。 getprotobynumber()*   从协议号得到对应的协议名和协议号。 getservbyname()*   从一个服务的名字得到对应的服务名以及端口号。 getservbyport()*   从一个端口号得到对应的服务名以及端口号。  *表示例程在某些情况下可能会阻塞。

11 Winsock 2.3 针对Microsoft Windows的扩展函数   为了适用于Windows下的消息机制和异步的I/O选择操作,Windows Sockets API在功能上扩充了将近20个函数,其中扩充的部分均冠以前缀WSA(Windows Sockets Asynchronous)。本质上,这些扩展的API是为了应用程序能更好地处理基于消息的异步发送的网络事件。虽然基于Windows Sockets的编程并不强制要使用这个扩展的API集(WSAStartup()和WSACleanup()除外)但推荐应用程序开发者遵循Microsoft Windows的编程范例。 WSAAsyncGetHostByAddr()     获取对应于一个地址的主机信息(一个标准的Berkeley的getXbyY()函数集合的异步版本 )  WSAAsyncGetHostByName() 获取对应于一个主机名的主机信息(提供了一个标准Berkeley的gethostbyname()函数的异步基于消息的实现)  WSAAsyncGetProtoByName() 获取对应于一个协议名的协议信息(异步版本)  WSAAsyncGetProtoByNumber()获取对应于一个协议号的协议信息(异步)  WSAAsyncGetServByName() 获取对应于一个服务名的服务信息(异步)

12 Winsock WSAAsyncGetServByPort() 获取对应于一个端口号的服务信息(异步版本)
 WSAAsyncSelect()            select()函数的异步版本。  WSACancelAsyncRequest()     取消一个未完成的WSAAsyncGetXByY()函数的实例。  WSACancelBlockingCall()     取消未完成的阻塞的API调用。  WSACleanup()           从底层的Windows Sockets DLL中撤销注册。  WSAGetLastError()           得到最近的一个Windows Sockets API调用错误的详细情况。  WSAIsBlocking()             确定底层的Windows Sockets DLL是否在该线程已经被一个调用阻塞。  WSASetBlockingHook()        为底层的Windows Sockets实现设置阻塞嵌入(hook)程序入口  WSASetLastError()           设置最近一次错误信息  WSAStartup()                初始化底层的Windows Sockets DLL  WSAUnhookBlockingHook()    恢复原始的阻塞嵌入(hook)处理程序

13 Winsock对Berkeley socket的扩充
异步选择机制 在windows sockets中提供了一组异步扩展函数,实现基于消息机制的网络通信编程,其中关键是提供了对网络事件基于消息的异步存取,其核心是异步选择函数WSAAsyncSelecet()。这个函数用来注册应用程序感兴趣的网络事件,当这些网络事件发生时,应用程序相应窗口函数将得到一个消息,应用程序根据该消息,利用条件判定语句进行判断,完成相应的操作。 WSAAsyncSelecet ()函数的原型为: int PASCAL FOR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent); 参数含义:

14 Winsock对Berkeley socket的扩充
SOCKET s----应用程序申请到的套接字 hWnd---- 接收winsock消息的窗口句柄 wMsg----向窗口hWnd发出的消息的名称 lEvent----被注册的网络事件 功能描述: 即请求winsock.DLL在检测到套接字s上发生的某个网络事件IEvent时,向窗口hWnd发送一个消息wMSG,并自动地设置套接字处于非阻塞工作方式。其中的事件可以是一个或多个的组合。 通常事件包括允许读数据,写数据、连接、关闭等六种事件。 利用重载以下成员函数来处理各种网络事件。

15 Winsock对Berkeley socket的扩充
标记 事件 需要重载的函数 FD_READ 有数据到达时发生 void OnReceive( int nErrorCode ); FD_WRITE 允许数据发送时产生 void OnSend( int nErrorCode ); FD_OOB 收到外带数据时发生 void OnOutOfBandData( int nErrorCode ); FD_ACCEPT 有连接请求到达时发生 void OnAccept( int nErrorCode ); FD_CONNECT 作为客户端连接成功时发生 void OnConnect( int nErrorCode ); FD_CLOSE 套接口关闭时发生 void OnClose( int nErrorCode );

16 Winsock对Berkeley socket的扩充
lEvent可以是一种或多种网络事件的组合(需要多个网络事件的组合时通过OR操作符(|)来表示),例如,如果我们希望在套接字S上收到数据或允许发送数据时收到消息,这时函数的调用格式为: WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);

17 Winsock对Berkeley socket的扩充
异步请求服务   异步数据库函数允许应用程序用异步方式请求信息。某些网络实现和或配置,需要通过执行网络操作来应答这些请求。WSAAsyncGetXByY()函数允许应用程序开发者不必象在使用Berkeley标准函数时阻塞整个Windows环境。WSACancelAsyncRequest()函数可以允许一个应用程序取消任何未完成的异步的WSAAsyncGetXByY()请求。

18 Winsock对Berkeley socket的扩充
利用阻塞钩链进行阻塞处理 windows是一个异步操作系统,在windows内任何事件都是异步发生的,发生后,windows给程序启动此操作时指定的窗口函数发送一个消息,windows中对消息的处理用类似于下面的循环语句进行。 MSGmsg : While(GetMessage(&msg,NULL ,0 ,0 ) ) {  TranslateMessage (&msg) ; /* 翻译虚拟键码 */  DispatchMessage (&msg) ; } 在循环语句后通常编写一个消息处理过程(“钩子”(hook)例程)。

19 Winsock对Berkeley socket的扩充
在winsock中有一个默认的阻塞处理例程BlockingHook(…),这个处理例程是简单地获取并发送winsock消息。 对于要求更复杂的消息处理的应用程序应建立自已的处理过程用的钩子程序。为此在winsock的API中提供了WSASetBlockingHook(…)和WSAUnHookBlockingHook(…)两个函数,前者用于定义使用自已的阻塞钩子,后者用于恢复缺省钩子。 在编写阻塞处理例程时,除了可用WSACancelBlockingCall()函数外不能使用其它的winsock API函数。 winsock提供了两个检测和处理阻塞操作的函数:WSAIsBlocking(viod)和WSACancelBlockingCall(void)。 前者检查确定当前是否有阻塞操作,并返回布尔值;若有阻塞操作,应用程序可以进入阻塞操作处理;若有必要调用后者取消当前的阻塞操作

20 Winsock对Berkeley socket的扩充
错误处理 如果调用一个Winsock 函数时发生了错误情况,就可用WSAGetLastError函数来获得一个代码,这个代码明确地表明发生的错误情况。 WSAGetLastError 函数返回的这些错误都有预定义常量值,根据Winsock 版本的不同,这些值在Winsock .h或Winsock2.h中声明。

21 Windows Sockets 2新增函数一览
WSAAccept()                 accept()函数的扩展版本,它支持条件接收和套接口分组 WSACloseEvent()             释放一个事件对象。 WSAConnect()                connect()函数的扩展版本,它支持连接数据交 换和QOS规范 WSACreateEvent()            创建一个事件对象。 WSADuplicateSocket()        为一个共享套接口创建一个新的套接口描述字。 WSAEnumNetworkEvents()      检查是否有网络事件发生。 WSAEnumProtocols()         得到每个可以使用的协议的信息 WSAEventSelect()           把网络事件和一个事件对象连接 WSAGetOverlappedResu()      得到重叠操作的完成状态。 WSAGetQOSByName()           对于一个传输协议服务名字提供相应的QOS参数 WSAHtonl()                  htonl()函数的扩展版本。 WSAHtons()                  htons()函数的扩展版本。 WSAIoctl()                  ioctlsocket()函数的允许重叠操作的版本。

22 Windows Sockets 2新增函数一览
WSAJoinLeaf()               在多点对话中加入一个叶节点。 WSANtohl()                  ntohl()函数的扩展版本。 WSANtohs()                  ntohs()函数的扩展版本。 WSARecv()                   recv()函数的扩展版本。它支持分散/聚集I/O和重叠套接口操作 WSARecvDisconnect()     终止套接口的接收操作。如果套接口是基于连接的,得到拆除数据 WSARecvFrom()           recvfrom()函数的扩展版本。它支持分散/聚集I/O和重叠套接口操作 WSAResetEvent()         重新初始化一个数据对象。 WSASend()               send()函数的或者版本。它支持分散/聚集I/O和重叠套接口操作。 WSASendDisconnect()     启动一系列拆除套接口连接的操作,并且可以选择发送拆除数据。 WSASendTo()             sendto()函数的扩展版本。它支持分散/聚集I/O和重叠套接口操作。 WSASetEvent()           设置一个数据对象。 WSASocket()             socket()函数的扩展版本。它以一个PROTOCOL_INFO结构作为输入参数,并且允许创建重叠套接口。它还允许创建套接口组。 WSAWaitForMultipleEvents()  阻塞多个事件对象。

23 Winsock编程实例 参见WORD文档实例

24 Thank You!


Download ppt "网络编程技术 设计、制作:谭献海 Email:xhtan@home.swjtu.edu.cn."

Similar presentations


Ads by Google