專接本 網(wǎng)絡(luò)操作系統(tǒng) 課件第五章 網(wǎng)絡(luò)操作系統(tǒng)的接口_第1頁
專接本 網(wǎng)絡(luò)操作系統(tǒng) 課件第五章 網(wǎng)絡(luò)操作系統(tǒng)的接口_第2頁
專接本 網(wǎng)絡(luò)操作系統(tǒng) 課件第五章 網(wǎng)絡(luò)操作系統(tǒng)的接口_第3頁
專接本 網(wǎng)絡(luò)操作系統(tǒng) 課件第五章 網(wǎng)絡(luò)操作系統(tǒng)的接口_第4頁
專接本 網(wǎng)絡(luò)操作系統(tǒng) 課件第五章 網(wǎng)絡(luò)操作系統(tǒng)的接口_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

網(wǎng)絡(luò)操作系統(tǒng)第五章網(wǎng)絡(luò)操作系統(tǒng)

的接口學(xué)習(xí)目標(biāo)通過本章的學(xué)習(xí),希望您能夠了解:應(yīng)用程序接口的編程使用方法套接字在網(wǎng)絡(luò)通信中的應(yīng)用本章內(nèi)容1.應(yīng)用程序接口的概念2.UNIX套接字及其應(yīng)用3.WinSock及其應(yīng)用課程議題1.應(yīng)用程序接口的概念一、應(yīng)用程序接口的概念應(yīng)用程序接口是一組定義、程序及協(xié)議的集合,通過API接口可以實(shí)現(xiàn)計(jì)算機(jī)軟件之間的相互通信。目的是提供應(yīng)用程序與開發(fā)人員基于某軟件或硬件的以訪問一組例程的能力,而又無需訪問源碼,或理解內(nèi)部工作機(jī)制的細(xì)節(jié)。操作系統(tǒng)的用戶接口包括命令輸入和系統(tǒng)調(diào)用,應(yīng)用程序接口是完成某一個(gè)功能的多個(gè)系統(tǒng)調(diào)用和命令的組合,其功能是完成某一特定的操作。優(yōu)點(diǎn):簡化編程、提高效率WindowsAPIWindowsAPI是一套用來控制Windows的各個(gè)部件的外觀和行為的一套預(yù)先定義的Windows函數(shù).用戶的每個(gè)動(dòng)作都會(huì)引發(fā)一個(gè)或幾個(gè)函數(shù)的運(yùn)行以告訴Windows發(fā)生了什么.API函數(shù)包含在Windows系統(tǒng)目錄下的動(dòng)態(tài)連接庫文件中。更易理解地說:Windows這個(gè)多作業(yè)系統(tǒng)除了協(xié)調(diào)應(yīng)用程式的執(zhí)行、分配內(nèi)存、管理系統(tǒng)資源…

之外,她同時(shí)也是一個(gè)很大的服務(wù)中心,調(diào)用這個(gè)服務(wù)中心的各種服務(wù)(每一種服務(wù)就是一個(gè)函數(shù)),可以幫應(yīng)用程式達(dá)到開啟視窗、描繪圖形、使用周邊設(shè)備…等目的,由于這些函數(shù)服務(wù)的對象是應(yīng)用程式,所以便稱之為ApplicationProgrammingInterface,簡稱API函數(shù)。WIN32API也就是MicrosoftWindows32位平臺的應(yīng)用程序編程接口。在這些工具中提供了大量的類庫和各種控件,它們替代了API的神秘功能,事實(shí)上這些類庫和控件都是構(gòu)架在WIN32API函數(shù)基礎(chǔ)之上的,是封裝了的API函數(shù)的集合。它們把常用的API函數(shù)的組合在一起成為一個(gè)控件或類庫,并賦予其方便的使用方法,所以極大的加速了WINDOWS應(yīng)用程序開發(fā)的過程。有了這些控件和類庫,程序員便可以把主要精力放在程序整體功能的設(shè)計(jì)上,而不必過于關(guān)注技術(shù)細(xì)節(jié)。應(yīng)用程序接口(API)API也是一種中間件,為各種不同的平臺提供數(shù)據(jù)共享。API分類:1)遠(yuǎn)程過程調(diào)用:通過作用在共享數(shù)據(jù)緩存器上的過程實(shí)現(xiàn)程序間的通信。2)標(biāo)準(zhǔn)查詢語言(SQL):是標(biāo)準(zhǔn)的訪問數(shù)據(jù)庫的查詢語言,通過通用數(shù)據(jù)庫實(shí)現(xiàn)應(yīng)用程序間的數(shù)據(jù)共享。3)文件傳輸:通過發(fā)送格式化的文件實(shí)現(xiàn)應(yīng)用程序間的數(shù)據(jù)共享4)信息交付:指松耦合或緊耦合應(yīng)用程序間的小型格式化信息,通過程序間的直接通信實(shí)現(xiàn)數(shù)據(jù)共享。開放API接口分類某些公司會(huì)將API作為其公共開放系統(tǒng),公司制訂自己的系統(tǒng)接口標(biāo)準(zhǔn),當(dāng)需要執(zhí)行系統(tǒng)整合、自定義和程序應(yīng)用等操作時(shí),公司所有成員都可以通過該接口標(biāo)準(zhǔn)調(diào)用源代碼,該接口標(biāo)準(zhǔn)稱為開放式API。三種占主導(dǎo)地位的開放式API:1)

AT&T的UNIXSystemV,提供TLI/XTI接口。2)伯克利的軟件分布系統(tǒng)(BSD),提供Socket接口。3)

Microsoft的Windows系列,提供WinSock接口。一、TLI/XTI函數(shù)TLI即傳輸層接口,提供了OSI傳輸層和會(huì)話層之間的API。XTI即開放式傳送接口,它由TLI接口演變而來。TLI/XTI是一組函數(shù)的集合,為用戶提供傳輸層接口,包括建立通信、管理連接以及傳送數(shù)據(jù)、應(yīng)用程序利用這些函數(shù)實(shí)現(xiàn)網(wǎng)絡(luò)應(yīng)用??刂频讓拥木W(wǎng)絡(luò)活動(dòng)。1.TLI/XTI結(jié)構(gòu)TLI/XTI把相互通信的兩個(gè)進(jìn)程稱為端點(diǎn)。提供網(wǎng)絡(luò)應(yīng)用底層端點(diǎn)到端點(diǎn)的通信,為用戶應(yīng)用進(jìn)程提供了直接傳輸?shù)慕涌?。TLI/XTI提供了直接傳輸?shù)慕涌冢詫?shù)據(jù)封裝和協(xié)議指定留給了用戶,具有更多的靈活性,當(dāng)然也失去了部分的通用性。用戶進(jìn)程端點(diǎn)傳輸層用戶進(jìn)程端點(diǎn)傳輸層2.TLI/XTI實(shí)例見課本P142頁程序?qū)嵗LI/XTI的服務(wù)模式面向連接的服務(wù)模式和面向非連接的服務(wù)模式??蛻舳朔?wù)端客戶端服務(wù)端SYNSYN,ackackSYNRSTT_openT_bindT_listenT_openT_bindT_connect課程議題2.UNIX套接字及其應(yīng)用一、套接字TCP/IP參考模型就是廣為人知的Socket接口。套接字,也就是Socket接口,簡單地說就是通信雙方的一種約定,利用套接字中的相關(guān)函數(shù)來完成通信過程。Socket協(xié)議的形象描述socket非常類似于電話插座。以一個(gè)國家級電話網(wǎng)為例。在電話系統(tǒng)中,一般用戶只能感受到本地電話機(jī)和對方電話號碼的存在,建立通話的過程,話音傳輸?shù)倪^程以及整個(gè)電話系統(tǒng)的技術(shù)細(xì)節(jié)對他都是透明的,這也與socket機(jī)制非常相似。socket利用網(wǎng)間網(wǎng)通信設(shè)施實(shí)現(xiàn)進(jìn)程通信,但它對通信設(shè)施的細(xì)節(jié)毫不關(guān)心,只要通信設(shè)施能提供足夠的通信能力,它就滿足了。通信原理Socket可以看成在兩個(gè)程序間進(jìn)行通信連接中的一個(gè)端點(diǎn)。一個(gè)程序?qū)⒁欢涡畔懭隨ocket中,該Socket將這段信息發(fā)送給另外一個(gè)Socket,使這段信息能傳送到其它程序中。ProgrammeAProgrammeAHostAHostB套接字TCP/IP網(wǎng)絡(luò)網(wǎng)絡(luò)接口卡socketsocket實(shí)質(zhì)上提供了進(jìn)程通信的端點(diǎn)。進(jìn)程通信之前,雙方首先必須各自創(chuàng)建一個(gè)端點(diǎn),否則是沒有辦法建立聯(lián)系并相互通信的。正如打電話之前,雙方必須各自擁有一臺電話機(jī)一樣。在網(wǎng)間網(wǎng)內(nèi)部,每一個(gè)socket用一個(gè)半相關(guān)描述:(協(xié)議,本地地址,本地端口)

用IP地址尋找目的地,IP地址是32位,通常用點(diǎn)分十進(jìn)制方式表示。IPv6共128位。端口:16位,范圍0-65535,低于256的端口號為保留給標(biāo)準(zhǔn)應(yīng)用程序。主要用于區(qū)分那個(gè)進(jìn)程所用傳輸?shù)臄?shù)據(jù)。套接字分類套接字是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本單元??梢詫⑻捉幼挚醋鍪遣煌鳈C(jī)間的進(jìn)程進(jìn)行雙向通信的端點(diǎn),它構(gòu)成了單個(gè)主機(jī)內(nèi)及整個(gè)網(wǎng)絡(luò)間的編程界面。按通信性質(zhì)分為:流套接字和數(shù)據(jù)報(bào)套接字。套接字之間的連接過程分為三步驟互聯(lián)網(wǎng)通信,至少需要一對套接字,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket,一個(gè)運(yùn)行于服務(wù)端,稱為ServerSocket。根據(jù)連接啟動(dòng)的方式以及本地套接字連接的目標(biāo),分為三步:1服務(wù)監(jiān)聽2客戶端請求3連接確認(rèn)2套接字的應(yīng)用通信過程見課本P149頁。利用套接字進(jìn)行網(wǎng)絡(luò)通信一般要用到一下幾個(gè)函數(shù):

1創(chuàng)建套接字函數(shù)socket;

2綁定本地名稱函數(shù)bind;

3建立連接函數(shù)connect;

4偵聽函數(shù)listen;

5接受數(shù)據(jù)函數(shù)accept;

6關(guān)閉套接字函數(shù)close。練習(xí)1.TLI/XTI是一組函數(shù)的集合,為用戶提供()A.網(wǎng)絡(luò)層接口 B.應(yīng)用層接口C.運(yùn)輸層接口 D.物理層接口2.IPV4的IP地址為()A.16位 B.32位C.64位 D.128位3.利用套接字進(jìn)行網(wǎng)絡(luò)通信時(shí),創(chuàng)建套接字的函數(shù)是()A.bind B.connectC.1isten D.socket練習(xí)1.TLI/XTI提供兩種服務(wù)模式,即面向連接的服務(wù)模式和______的服務(wù)模式。2.TLI/XTI把相互通信的兩個(gè)進(jìn)程稱為()

A.端口B.節(jié)點(diǎn)C.接口D.端點(diǎn)3.支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元是()

A.套接字B.端口C.端口號D.功能調(diào)用利用套接字進(jìn)行網(wǎng)絡(luò)通信時(shí),建立連接的函數(shù)是()

A.socket

B.bind

C.connect

D.accept支持雙向的數(shù)據(jù)流,但并不保證是可靠、有序、無重復(fù)的是()

A.流套接字B.數(shù)據(jù)報(bào)套接字

C.客戶端套接字D.服務(wù)器端套接字通常所說的套接字(socket)一般指UNIX環(huán)境下流行的_______________編程接口。課程議題3.WinSock及其應(yīng)用一、winsock概述在Windows環(huán)境下利用套接字在TCP/IP上的編程接口就叫做WindowsSockets,即WinSock。通常所說的套接字,是指UNIX環(huán)境下的TCP/IP編程接口。WinSock規(guī)范是以U.CBerkeley大學(xué)的BSDUNIX中流行的Socket接口為范例定義了一套MicrosoftWindows下網(wǎng)絡(luò)編程接口,它不僅包含了人們所熟悉的BerkeleySocket風(fēng)格的庫函數(shù),也包含了一組針對Windows的擴(kuò)展庫函數(shù),以使程序員能充分的利用Windows消息驅(qū)動(dòng)機(jī)制進(jìn)行編程。WinSock支持單一的通信域,即Internet域。各種進(jìn)程使用這個(gè)域用Internet協(xié)議進(jìn)行通信。分為兩種套接字:流套接字:提供了雙向的、有序的、無重復(fù)并且無記錄邊界的數(shù)據(jù)流服務(wù)。數(shù)據(jù)報(bào)套接字:支持雙向的數(shù)據(jù)流,但并不保證可靠、有序、無重復(fù)。但是保留了記錄邊界,采用包交換網(wǎng)絡(luò)相似的模型來實(shí)現(xiàn)數(shù)據(jù)邊界的記錄。二、使用WinSock實(shí)現(xiàn)網(wǎng)絡(luò)通信客戶/服務(wù)器模型(c/s模型)網(wǎng)絡(luò)應(yīng)用系統(tǒng)通常是一個(gè)客戶/服務(wù)器模型,要進(jìn)行網(wǎng)絡(luò)通信,首先我們要理解什么是c/s模型。c/s模型由兩部分構(gòu)成:客戶端和服務(wù)器端。

服務(wù)器工作的大致過程服務(wù)器工作的大致過程是:建立一個(gè)服務(wù)器,開啟服務(wù)器使服務(wù)器處于監(jiān)聽狀態(tài),它檢查是否有客戶請求它的服務(wù);如果有客戶進(jìn)行請求且條件合格則接受此客戶的服務(wù)請求,即建立與客戶端的連接,此后雙方便可以傳送數(shù)據(jù)。并且服務(wù)器能同時(shí)對多個(gè)客戶端提供服務(wù)??蛻舳斯ぷ鞯拇笾逻^程客戶端工作的大致過程:客戶端向服務(wù)器提出服務(wù)請求,請求連接到服務(wù)器,如果服務(wù)器接受了它的請求,則雙方可以通信。一般情況下,由客戶主動(dòng)發(fā)起連接請求,而發(fā)起結(jié)束通信請求方則不一定。一個(gè)TCP連接的套接口對是一個(gè)定義該連接的兩個(gè)端點(diǎn)的四元組:

<本地IP地址,本地TCP端口號,遠(yuǎn)程IP地址,遠(yuǎn)程TCP端口號〉。套接口對唯一標(biāo)識一個(gè)互聯(lián)網(wǎng)上的TCP連接。

標(biāo)識每個(gè)端點(diǎn)的兩個(gè)值<IP地址,端口號>就稱為一個(gè)套接口。

若果使用無連接的通信只需要建立一個(gè)半關(guān)聯(lián),在發(fā)送和接收時(shí)指明另一半的參數(shù)就可以了。所以說無連接的通信是將數(shù)據(jù)發(fā)送到另一臺主機(jī)的指定端口。此外,不論是有連接還是無連接的通信都不需要兩端端口相同。二、WinSock的使用及重要函數(shù)講解:1Winsock的啟動(dòng)和終止

應(yīng)用程序在使用Windows

Sockets

DLL之前必須先調(diào)用函數(shù)WSAStartup()。上面的流程中我們并沒有列出該函數(shù),事實(shí)上由于winsock由DLL形式提供,為了完成一系列的初始化操作,每一個(gè)使用winsock的應(yīng)用程序都必須進(jìn)行WSAStartup()函數(shù)調(diào)用,并且只有在成功的完成調(diào)用之后才能使用scoket。

WSAStartup()函數(shù)

函數(shù)的原形如下:

int

PASCAL

FAR

WSAStartup(WORD

wVersionRequired,

LPWSADATA

lpWSAData);

wVersionRequired表示欲使用的winsock

API的版本,這是一個(gè)WORD類型的整數(shù),它的高位字節(jié)是次版本號,低位字節(jié)是主版本號;lpWSAData是指向WSADATA結(jié)構(gòu)的指針,用于返回Windows

Sockets

DLL的一些技術(shù)細(xì)節(jié)。如果初始化成功則函數(shù)返回0,否則返回各種錯(cuò)誤代碼。2建立通信連接socket()函數(shù):創(chuàng)建套接字

任何用戶要進(jìn)行通信都要調(diào)用socket()函數(shù)指定通信協(xié)議的類型,創(chuàng)建套接字。

函數(shù)的原形:int

socket(int

family,int

type,int

protocol);

參數(shù)參數(shù)family指明協(xié)議族,也就是利用它來分辨地址的類型,一般為AF_INET表示在Internet上的socket;type指明套接口類型,也即是通信的類型可以為SOCK_STREAM或SOCK_DGRAM;protocol參數(shù)說明該套接字使用的協(xié)議族中的特定協(xié)議,如果調(diào)用者不希望特別指定使用的協(xié)議,則置為0,使用默認(rèn)的連接模式。

若函數(shù)調(diào)用成功,則返回一個(gè)套接口描述字,簡稱套接字(sockfd);若調(diào)用失敗,則返回INVALID_SOCKET。

一個(gè)套接字用socket()創(chuàng)建后,它其實(shí)還沒有與任何特定的本地或目的地址相關(guān)聯(lián)。在很多情況下,應(yīng)用程序并不關(guān)心他們使用的本地地址,這時(shí)可以不調(diào)用此函數(shù),而由協(xié)議軟件為他們選擇一個(gè)。如果要使用指定的端口,則創(chuàng)建了一個(gè)套接口之后,服務(wù)器必須調(diào)用bind()函數(shù)給套接口分配一個(gè)本地協(xié)議地址,捆綁端口。

函數(shù)原形:int

bind(int

sockfd,const

struct

sockaddr

*myaddr,socklen_t

addrlen);

參數(shù)sockfd是綁定的套接字描述符,是由socket返回的;myaddr是與套接字綁定的一個(gè)本地地址結(jié)構(gòu),其長度可變,結(jié)構(gòu)隨協(xié)議族的不同而不同;addrlen是myaddr的長度。

返回0表示函數(shù)調(diào)用成功,返回-1(SOCKET_ERROR)表示出錯(cuò)。

bind()函數(shù):指定本地地址connect()函數(shù):將套接字連接到目的地址

初始創(chuàng)建的套接字并未與任何外地目的地址關(guān)聯(lián),客戶端調(diào)用connect()為套接字綁定一個(gè)永久的目的地址,將它置于已經(jīng)連接的狀態(tài)。對數(shù)據(jù)流方式的套接字,必須在傳輸數(shù)據(jù)前,調(diào)用connect()構(gòu)造一個(gè)與目的地的TCP連接,并不能構(gòu)造連接時(shí)返回一個(gè)差錯(cuò)代碼。如果是數(shù)據(jù)報(bào)方式則不是必須在傳輸數(shù)據(jù)之前調(diào)用connect。

函數(shù)原形:

int

connect(int

s,const

struct

sockaddr

*servaddr,socklen_t

addrlen);

s是本地套接字描述符;servaddr是指向?qū)Ψ教捉幼值刂方Y(jié)構(gòu)的指針,這里的套接口地址是服務(wù)器的套接口地址,包括服務(wù)器的IP地址和端口號,指明了要連接到的服務(wù)器;addrlen是對方套接字地址結(jié)構(gòu)的長度。

返回0表示調(diào)用成功,返回-1表示出錯(cuò)。

listen()函數(shù):設(shè)置等待連接狀態(tài)對于一個(gè)服務(wù)器的程序,當(dāng)申請到套接字,并調(diào)用bind()與本地地址綁定后,就應(yīng)該等待某個(gè)客戶機(jī)的請求連接。函數(shù)listen()就是把套接字置為這種狀態(tài),它僅被服務(wù)器調(diào)用,它使服務(wù)器的套接口成為一個(gè)監(jiān)聽套接口。事實(shí)上當(dāng)用socket()函數(shù)建立一個(gè)套接口時(shí),它是一個(gè)主動(dòng)套接口,也就是說它應(yīng)該調(diào)用connect()函數(shù)向服務(wù)器發(fā)起連接的套接口,函數(shù)Listen()將此套接口轉(zhuǎn)變?yōu)楸粍?dòng)套接口,使它接受客戶向它發(fā)出的連接請求。

函數(shù)原形:

int

listen(int

sockfd,int

backlog);

參數(shù)sockfd是套接字描述符;backlog是指明等待連接的隊(duì)列的最大長度,可以取1-5。

返回0表示調(diào)用成功,返回-1表示出錯(cuò)。

accept()函數(shù):接收連接請求服務(wù)器進(jìn)程使用系統(tǒng)調(diào)用socket,bind和listen創(chuàng)建一個(gè)套接字,將它綁定到知名的端口,并指定連接請求的隊(duì)列長度,進(jìn)入監(jiān)聽狀態(tài),當(dāng)有連接請求到達(dá)時(shí),服務(wù)器調(diào)用accept()接收連接請求,它返回一個(gè)新建立的連接。

函數(shù)原形:int

accept(int

sockfd,struct

sockaddr

*

cliaddr,socklen_t

*addrlen);

參數(shù)sockfd是套接字描述符;指針cliaddr用于返回請求連接的客戶方套接字地址;指針addrlen用于返回該地址結(jié)構(gòu)的長度。

如果沒有發(fā)生錯(cuò)誤,則返回新的套接字,否則返回INVALID_SOCKET。

值得注意的一點(diǎn)是,當(dāng)accept()執(zhí)行成功,它的返回值是內(nèi)核自動(dòng)生成的一個(gè)全新的描述字,它與客戶進(jìn)行數(shù)據(jù)通信,我們稱之為會(huì)話套接口。accept()參數(shù)中的scokfd是監(jiān)聽套接口,accept()返回的套接口是一個(gè)已經(jīng)連接到某個(gè)客戶套接字的已連接套接口(會(huì)話套接口)。我們一定要區(qū)分這兩種套接口。一個(gè)服務(wù)器只生成一個(gè)監(jiān)聽套接口且一直存在,直到服務(wù)器關(guān)閉。內(nèi)核則是為每個(gè)被接受的客戶創(chuàng)建一個(gè)已連接套接口,服務(wù)器完成客戶的服務(wù)時(shí),關(guān)閉與之通信的已連接套接口。3發(fā)送和接收數(shù)據(jù)當(dāng)服務(wù)器端和客戶端建立連接以后,就可以在兩臺機(jī)器之間傳送數(shù)據(jù),也即是用winsock

API函數(shù)在兩臺連接成功的機(jī)器之間進(jìn)行通信。下面我們介紹幾個(gè)傳送數(shù)據(jù)的函數(shù),無論是客戶端,還是服務(wù)器端都可以使用這些函數(shù):

在數(shù)據(jù)流方式中,一個(gè)連接建立以后,或者在數(shù)據(jù)報(bào)方式下,調(diào)用了connect()進(jìn)行了套接字與目的地址的綁定后,就可以調(diào)用send()和recv()進(jìn)行數(shù)據(jù)傳輸。send():使用連接好的

Socket

發(fā)送數(shù)據(jù)

格式:

int

send(

SOCKET

s,

const

char

FAR

*buf,

int

len,

int

flags

);

參數(shù)

s是Socket

的識別碼;buf指向發(fā)送緩沖區(qū)的首址;len是緩沖區(qū)的長度;

flags指定傳輸控制的方式,一般設(shè)為0。

傳回值:

成功

-

送出的數(shù)據(jù)的長度

失敗

-

SOCKET_ERROR

(呼叫

WSAGetLastError()

可得知原因)

此函數(shù)適用于連接的

Datagram

Stream

Socket

來傳送資料。

Datagram

Socket

而言,是

datagram

的大小超過限制,則將不會(huì)送出任何資料,并會(huì)傳回錯(cuò)誤值。

recv():自

Socket

接收數(shù)據(jù)

格式:

int

recv(

SOCKET

s,

char

FAR

*buf,

int

len,

int

flags

);

參數(shù)s是Socket

的識別碼;指針buf指向接收緩沖區(qū)的首址;len是buf

的長度

;flags指定傳輸控制的方式,一般設(shè)為0。

傳回值:

成功

-

接收到的數(shù)據(jù)長度

(若對方

Socket

已關(guān)閉,則為

0)

失敗

-

SOCKET_ERROR

(呼叫

WSAGetLastError()

可得知原因)

此函數(shù)適用于連接式的

Datagram

Socket

Stream

Socket。對

Stream

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

數(shù)據(jù),但其數(shù)量不超過

len

的大小。對

Datagram

Socket

言,只取出第一個(gè)

datagram;若是該

datagram

大于使用者提供的儲存空間,那么只有該空間大小的資料被取出,多余的資料將丟失,且回復(fù)錯(cuò)誤信息。

如果我們以數(shù)據(jù)報(bào)的方式通信,由于事先不用建立連接,所以可以跳過connect()而直接用recvfrom()和sendto()兩個(gè)函數(shù)進(jìn)行通信:

recvfrom():讀取一個(gè)

Datagram,并儲存數(shù)據(jù)來源的地址。

格式:

int

recvfrom(

SOCKET

s,char

FAR

*buf,int

len,int

flags,

struct

socketaddr

FAR

*from,int

FAR*fromlen

);

參數(shù)s,buf,len,flags與send()中的相同;指針from返回?cái)?shù)據(jù)發(fā)送者的地址;fromlen是from

的大小。

傳回值:

成功

-

接收到的數(shù)據(jù)長度

(若對方

Socket

已關(guān)閉,則為

0);失敗

-

SOCKET_ERROR

(呼叫

WSAGetLastError()

可得知原因)。對

Stream

Socket而言,其作用與

recv()

相同,參數(shù)

from

fromlen

將不被用到。sendto():將數(shù)據(jù)送到指定的目的地。

格式:

int

sendto(

SOCKET

s,const

char

FAR

*buf,int

len,int

flags,const

struct

sockaddr

FAR

*to,int

tolen

);

參數(shù)s,buf,len,flags與send()中的相同;指針to指向數(shù)據(jù)發(fā)送的目的地址;tolen是to的大小。

傳回值:

成功

-

送出的資料長度

失敗

-

SOCKET_ERROR

(呼叫

WSAGetLastError()

可得知原因)

。

此函數(shù)適用于

Datagram

Stream

Socket

來傳送數(shù)據(jù)到指定的位址。對Datagram

Socket

言,若是

d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論