专接本 网络操作系统 课件第五章 网络操作系统的接口_第1页
专接本 网络操作系统 课件第五章 网络操作系统的接口_第2页
专接本 网络操作系统 课件第五章 网络操作系统的接口_第3页
专接本 网络操作系统 课件第五章 网络操作系统的接口_第4页
专接本 网络操作系统 课件第五章 网络操作系统的接口_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络操作系统第五章网络操作系统

的接口学习目标通过本章的学习,希望您能够了解:应用程序接口的编程使用方法套接字在网络通信中的应用本章内容1.应用程序接口的概念2.UNIX套接字及其应用3.WinSock及其应用课程议题1.应用程序接口的概念一、应用程序接口的概念应用程序接口是一组定义、程序及协议的集合,通过API接口可以实现计算机软件之间的相互通信。目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。操作系统的用户接口包括命令输入和系统调用,应用程序接口是完成某一个功能的多个系统调用和命令的组合,其功能是完成某一特定的操作。优点:简化编程、提高效率WindowsAPIWindowsAPI是一套用来控制Windows的各个部件的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么.API函数包含在Windows系统目录下的动态连接库文件中。更易理解地说:Windows这个多作业系统除了协调应用程式的执行、分配内存、管理系统资源…

之外,她同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备…等目的,由于这些函数服务的对象是应用程式,所以便称之为ApplicationProgrammingInterface,简称API函数。WIN32API也就是MicrosoftWindows32位平台的应用程序编程接口。在这些工具中提供了大量的类库和各种控件,它们替代了API的神秘功能,事实上这些类库和控件都是构架在WIN32API函数基础之上的,是封装了的API函数的集合。它们把常用的API函数的组合在一起成为一个控件或类库,并赋予其方便的使用方法,所以极大的加速了WINDOWS应用程序开发的过程。有了这些控件和类库,程序员便可以把主要精力放在程序整体功能的设计上,而不必过于关注技术细节。应用程序接口(API)API也是一种中间件,为各种不同的平台提供数据共享。API分类:1)远程过程调用:通过作用在共享数据缓存器上的过程实现程序间的通信。2)标准查询语言(SQL):是标准的访问数据库的查询语言,通过通用数据库实现应用程序间的数据共享。3)文件传输:通过发送格式化的文件实现应用程序间的数据共享4)信息交付:指松耦合或紧耦合应用程序间的小型格式化信息,通过程序间的直接通信实现数据共享。开放API接口分类某些公司会将API作为其公共开放系统,公司制订自己的系统接口标准,当需要执行系统整合、自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码,该接口标准称为开放式API。三种占主导地位的开放式API:1)

AT&T的UNIXSystemV,提供TLI/XTI接口。2)伯克利的软件分布系统(BSD),提供Socket接口。3)

Microsoft的Windows系列,提供WinSock接口。一、TLI/XTI函数TLI即传输层接口,提供了OSI传输层和会话层之间的API。XTI即开放式传送接口,它由TLI接口演变而来。TLI/XTI是一组函数的集合,为用户提供传输层接口,包括建立通信、管理连接以及传送数据、应用程序利用这些函数实现网络应用。控制底层的网络活动。1.TLI/XTI结构TLI/XTI把相互通信的两个进程称为端点。提供网络应用底层端点到端点的通信,为用户应用进程提供了直接传输的接口。TLI/XTI提供了直接传输的接口,所以将数据封装和协议指定留给了用户,具有更多的灵活性,当然也失去了部分的通用性。用户进程端点传输层用户进程端点传输层2.TLI/XTI实例见课本P142页程序实例二、TLI/XTI的服务模式面向连接的服务模式和面向非连接的服务模式。客户端服务端客户端服务端SYNSYN,ackackSYNRSTT_openT_bindT_listenT_openT_bindT_connect课程议题2.UNIX套接字及其应用一、套接字TCP/IP参考模型就是广为人知的Socket接口。套接字,也就是Socket接口,简单地说就是通信双方的一种约定,利用套接字中的相关函数来完成通信过程。Socket协议的形象描述socket非常类似于电话插座。以一个国家级电话网为例。在电话系统中,一般用户只能感受到本地电话机和对方电话号码的存在,建立通话的过程,话音传输的过程以及整个电话系统的技术细节对他都是透明的,这也与socket机制非常相似。socket利用网间网通信设施实现进程通信,但它对通信设施的细节毫不关心,只要通信设施能提供足够的通信能力,它就满足了。通信原理Socket可以看成在两个程序间进行通信连接中的一个端点。一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket,使这段信息能传送到其它程序中。ProgrammeAProgrammeAHostAHostB套接字TCP/IP网络网络接口卡socketsocket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。在网间网内部,每一个socket用一个半相关描述:(协议,本地地址,本地端口)

用IP地址寻找目的地,IP地址是32位,通常用点分十进制方式表示。IPv6共128位。端口:16位,范围0-65535,低于256的端口号为保留给标准应用程序。主要用于区分那个进程所用传输的数据。套接字分类套接字是通信的基石,是支持TCP/IP协议的网络通信的基本单元。可以将套接字看做是不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。按通信性质分为:流套接字和数据报套接字。套接字之间的连接过程分为三步骤互联网通信,至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,一个运行于服务端,称为ServerSocket。根据连接启动的方式以及本地套接字连接的目标,分为三步:1服务监听2客户端请求3连接确认2套接字的应用通信过程见课本P149页。利用套接字进行网络通信一般要用到一下几个函数:

1创建套接字函数socket;

2绑定本地名称函数bind;

3建立连接函数connect;

4侦听函数listen;

5接受数据函数accept;

6关闭套接字函数close。练习1.TLI/XTI是一组函数的集合,为用户提供()A.网络层接口 B.应用层接口C.运输层接口 D.物理层接口2.IPV4的IP地址为()A.16位 B.32位C.64位 D.128位3.利用套接字进行网络通信时,创建套接字的函数是()A.bind B.connectC.1isten D.socket练习1.TLI/XTI提供两种服务模式,即面向连接的服务模式和______的服务模式。2.TLI/XTI把相互通信的两个进程称为()

A.端口B.节点C.接口D.端点3.支持TCP/IP协议的网络通信的基本操作单元是()

A.套接字B.端口C.端口号D.功能调用利用套接字进行网络通信时,建立连接的函数是()

A.socket

B.bind

C.connect

D.accept支持双向的数据流,但并不保证是可靠、有序、无重复的是()

A.流套接字B.数据报套接字

C.客户端套接字D.服务器端套接字通常所说的套接字(socket)一般指UNIX环境下流行的_______________编程接口。课程议题3.WinSock及其应用一、winsock概述在Windows环境下利用套接字在TCP/IP上的编程接口就叫做WindowsSockets,即WinSock。通常所说的套接字,是指UNIX环境下的TCP/IP编程接口。WinSock规范是以U.CBerkeley大学的BSDUNIX中流行的Socket接口为范例定义了一套MicrosoftWindows下网络编程接口,它不仅包含了人们所熟悉的BerkeleySocket风格的库函数,也包含了一组针对Windows的扩展库函数,以使程序员能充分的利用Windows消息驱动机制进行编程。WinSock支持单一的通信域,即Internet域。各种进程使用这个域用Internet协议进行通信。分为两种套接字:流套接字:提供了双向的、有序的、无重复并且无记录边界的数据流服务。数据报套接字:支持双向的数据流,但并不保证可靠、有序、无重复。但是保留了记录边界,采用包交换网络相似的模型来实现数据边界的记录。二、使用WinSock实现网络通信客户/服务器模型(c/s模型)网络应用系统通常是一个客户/服务器模型,要进行网络通信,首先我们要理解什么是c/s模型。c/s模型由两部分构成:客户端和服务器端。

服务器工作的大致过程服务器工作的大致过程是:建立一个服务器,开启服务器使服务器处于监听状态,它检查是否有客户请求它的服务;如果有客户进行请求且条件合格则接受此客户的服务请求,即建立与客户端的连接,此后双方便可以传送数据。并且服务器能同时对多个客户端提供服务。客户端工作的大致过程客户端工作的大致过程:客户端向服务器提出服务请求,请求连接到服务器,如果服务器接受了它的请求,则双方可以通信。一般情况下,由客户主动发起连接请求,而发起结束通信请求方则不一定。一个TCP连接的套接口对是一个定义该连接的两个端点的四元组:

<本地IP地址,本地TCP端口号,远程IP地址,远程TCP端口号〉。套接口对唯一标识一个互联网上的TCP连接。

标识每个端点的两个值<IP地址,端口号>就称为一个套接口。

若果使用无连接的通信只需要建立一个半关联,在发送和接收时指明另一半的参数就可以了。所以说无连接的通信是将数据发送到另一台主机的指定端口。此外,不论是有连接还是无连接的通信都不需要两端端口相同。二、WinSock的使用及重要函数讲解:1Winsock的启动和终止

应用程序在使用Windows

Sockets

DLL之前必须先调用函数WSAStartup()。上面的流程中我们并没有列出该函数,事实上由于winsock由DLL形式提供,为了完成一系列的初始化操作,每一个使用winsock的应用程序都必须进行WSAStartup()函数调用,并且只有在成功的完成调用之后才能使用scoket。

WSAStartup()函数

函数的原形如下:

int

PASCAL

FAR

WSAStartup(WORD

wVersionRequired,

LPWSADATA

lpWSAData);

wVersionRequired表示欲使用的winsock

API的版本,这是一个WORD类型的整数,它的高位字节是次版本号,低位字节是主版本号;lpWSAData是指向WSADATA结构的指针,用于返回Windows

Sockets

DLL的一些技术细节。如果初始化成功则函数返回0,否则返回各种错误代码。2建立通信连接socket()函数:创建套接字

任何用户要进行通信都要调用socket()函数指定通信协议的类型,创建套接字。

函数的原形:int

socket(int

family,int

type,int

protocol);

参数参数family指明协议族,也就是利用它来分辨地址的类型,一般为AF_INET表示在Internet上的socket;type指明套接口类型,也即是通信的类型可以为SOCK_STREAM或SOCK_DGRAM;protocol参数说明该套接字使用的协议族中的特定协议,如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。

若函数调用成功,则返回一个套接口描述字,简称套接字(sockfd);若调用失败,则返回INVALID_SOCKET。

一个套接字用socket()创建后,它其实还没有与任何特定的本地或目的地址相关联。在很多情况下,应用程序并不关心他们使用的本地地址,这时可以不调用此函数,而由协议软件为他们选择一个。如果要使用指定的端口,则创建了一个套接口之后,服务器必须调用bind()函数给套接口分配一个本地协议地址,捆绑端口。

函数原形:int

bind(int

sockfd,const

struct

sockaddr

*myaddr,socklen_t

addrlen);

参数sockfd是绑定的套接字描述符,是由socket返回的;myaddr是与套接字绑定的一个本地地址结构,其长度可变,结构随协议族的不同而不同;addrlen是myaddr的长度。

返回0表示函数调用成功,返回-1(SOCKET_ERROR)表示出错。

bind()函数:指定本地地址connect()函数:将套接字连接到目的地址

初始创建的套接字并未与任何外地目的地址关联,客户端调用connect()为套接字绑定一个永久的目的地址,将它置于已经连接的状态。对数据流方式的套接字,必须在传输数据前,调用connect()构造一个与目的地的TCP连接,并不能构造连接时返回一个差错代码。如果是数据报方式则不是必须在传输数据之前调用connect。

函数原形:

int

connect(int

s,const

struct

sockaddr

*servaddr,socklen_t

addrlen);

s是本地套接字描述符;servaddr是指向对方套接字地址结构的指针,这里的套接口地址是服务器的套接口地址,包括服务器的IP地址和端口号,指明了要连接到的服务器;addrlen是对方套接字地址结构的长度。

返回0表示调用成功,返回-1表示出错。

listen()函数:设置等待连接状态对于一个服务器的程序,当申请到套接字,并调用bind()与本地地址绑定后,就应该等待某个客户机的请求连接。函数listen()就是把套接字置为这种状态,它仅被服务器调用,它使服务器的套接口成为一个监听套接口。事实上当用socket()函数建立一个套接口时,它是一个主动套接口,也就是说它应该调用connect()函数向服务器发起连接的套接口,函数Listen()将此套接口转变为被动套接口,使它接受客户向它发出的连接请求。

函数原形:

int

listen(int

sockfd,int

backlog);

参数sockfd是套接字描述符;backlog是指明等待连接的队列的最大长度,可以取1-5。

返回0表示调用成功,返回-1表示出错。

accept()函数:接收连接请求服务器进程使用系统调用socket,bind和listen创建一个套接字,将它绑定到知名的端口,并指定连接请求的队列长度,进入监听状态,当有连接请求到达时,服务器调用accept()接收连接请求,它返回一个新建立的连接。

函数原形:int

accept(int

sockfd,struct

sockaddr

*

cliaddr,socklen_t

*addrlen);

参数sockfd是套接字描述符;指针cliaddr用于返回请求连接的客户方套接字地址;指针addrlen用于返回该地址结构的长度。

如果没有发生错误,则返回新的套接字,否则返回INVALID_SOCKET。

值得注意的一点是,当accept()执行成功,它的返回值是内核自动生成的一个全新的描述字,它与客户进行数据通信,我们称之为会话套接口。accept()参数中的scokfd是监听套接口,accept()返回的套接口是一个已经连接到某个客户套接字的已连接套接口(会话套接口)。我们一定要区分这两种套接口。一个服务器只生成一个监听套接口且一直存在,直到服务器关闭。内核则是为每个被接受的客户创建一个已连接套接口,服务器完成客户的服务时,关闭与之通信的已连接套接口。3发送和接收数据当服务器端和客户端建立连接以后,就可以在两台机器之间传送数据,也即是用winsock

API函数在两台连接成功的机器之间进行通信。下面我们介绍几个传送数据的函数,无论是客户端,还是服务器端都可以使用这些函数:

在数据流方式中,一个连接建立以后,或者在数据报方式下,调用了connect()进行了套接字与目的地址的绑定后,就可以调用send()和recv()进行数据传输。send():使用连接好的

Socket

发送数据

格式:

int

send(

SOCKET

s,

const

char

FAR

*buf,

int

len,

int

flags

);

参数

s是Socket

的识别码;buf指向发送缓冲区的首址;len是缓冲区的长度;

flags指定传输控制的方式,一般设为0。

传回值:

成功

-

送出的数据的长度

失败

-

SOCKET_ERROR

(呼叫

WSAGetLastError()

可得知原因)

此函数适用于连接的

Datagram

Stream

Socket

来传送资料。

Datagram

Socket

而言,是

datagram

的大小超过限制,则将不会送出任何资料,并会传回错误值。

recv():自

Socket

接收数据

格式:

int

recv(

SOCKET

s,

char

FAR

*buf,

int

len,

int

flags

);

参数s是Socket

的识别码;指针buf指向接收缓冲区的首址;len是buf

的长度

;flags指定传输控制的方式,一般设为0。

传回值:

成功

-

接收到的数据长度

(若对方

Socket

已关闭,则为

0)

失败

-

SOCKET_ERROR

(呼叫

WSAGetLastError()

可得知原因)

此函数适用于连接式的

Datagram

Socket

Stream

Socket。对

Stream

Socket而言,我们可以接收到目前有效的

数据,但其数量不超过

len

的大小。对

Datagram

Socket

言,只取出第一个

datagram;若是该

datagram

大于使用者提供的储存空间,那么只有该空间大小的资料被取出,多余的资料将丢失,且回复错误信息。

如果我们以数据报的方式通信,由于事先不用建立连接,所以可以跳过connect()而直接用recvfrom()和sendto()两个函数进行通信:

recvfrom():读取一个

Datagram,并储存数据来源的地址。

格式:

int

recvfrom(

SOCKET

s,char

FAR

*buf,int

len,int

flags,

struct

socketaddr

FAR

*from,int

FAR*fromlen

);

参数s,buf,len,flags与send()中的相同;指针from返回数据发送者的地址;fromlen是from

的大小。

传回值:

成功

-

接收到的数据长度

(若对方

Socket

已关闭,则为

0);失败

-

SOCKET_ERROR

(呼叫

WSAGetLastError()

可得知原因)。对

Stream

Socket而言,其作用与

recv()

相同,参数

from

fromlen

将不被用到。sendto():将数据送到指定的目的地。

格式:

int

sendto(

SOCKET

s,const

char

FAR

*buf,int

len,int

flags,const

struct

sockaddr

FAR

*to,int

tolen

);

参数s,buf,len,flags与send()中的相同;指针to指向数据发送的目的地址;tolen是to的大小。

传回值:

成功

-

送出的资料长度

失败

-

SOCKET_ERROR

(呼叫

WSAGetLastError()

可得知原因)

此函数适用于

Datagram

Stream

Socket

来传送数据到指定的位址。对Datagram

Socket

言,若是

d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论