專接本 網絡操作系統 課件第五章 網絡操作系統的接口_第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

提交評論