c從入門到精通光盤資源第17章網(wǎng)絡(luò)通信_(tái)第1頁
c從入門到精通光盤資源第17章網(wǎng)絡(luò)通信_(tái)第2頁
c從入門到精通光盤資源第17章網(wǎng)絡(luò)通信_(tái)第3頁
c從入門到精通光盤資源第17章網(wǎng)絡(luò)通信_(tái)第4頁
c從入門到精通光盤資源第17章網(wǎng)絡(luò)通信_(tái)第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第17章 網(wǎng)絡(luò)通信0102 套接字03簡單協(xié)議通訊TCP/IP協(xié)議1 TCP/IP協(xié)議OSI參考模型開放式系統(tǒng)互聯(lián)(Open System Interconnection)簡稱OSI,是國際標(biāo)準(zhǔn)化組織(ISO)為了實(shí)現(xiàn)計(jì)算機(jī)網(wǎng)絡(luò)的標(biāo)準(zhǔn)化而頒布的參考模型。 OSI參考模型采用分層的劃分原則,將網(wǎng)絡(luò)中的數(shù)據(jù)傳輸劃分為7層,每一層使用下層的服務(wù),并向上層提供服務(wù)。OSI參考模型的結(jié)構(gòu)層 次名 稱功 能 描 述第7層應(yīng)用層(Application)應(yīng)用層負(fù)責(zé)網(wǎng)絡(luò)中應(yīng)用程序與網(wǎng)絡(luò)操作系統(tǒng)之間的聯(lián)系。例如,建立和結(jié)束使用者之間的連接,管理建立相互連接使用的應(yīng)用資源第6層表示層(Presentation)表

2、示層用于確定數(shù)據(jù)交換的格式,它能夠解決應(yīng)用程序之間在數(shù)據(jù)格式上的差異,并負(fù)責(zé)設(shè)備之間所需要的字符集和數(shù)據(jù)的轉(zhuǎn)換第5層會(huì)話層(Session)會(huì)話層是用戶應(yīng)用程序與網(wǎng)絡(luò)層的接口,它能夠建立與其他設(shè)備的連接,即會(huì)話。并且它能夠?qū)?huì)話進(jìn)行有效的管理第4層傳輸層(Transport)傳輸層提供會(huì)話層和網(wǎng)絡(luò)層之間的傳輸服務(wù),該服務(wù)從會(huì)話層獲得數(shù)據(jù),必要時(shí)對(duì)數(shù)據(jù)進(jìn)行分割,然后傳輸層將數(shù)據(jù)傳遞到網(wǎng)絡(luò)層,并確保數(shù)據(jù)能正確無誤地傳送到網(wǎng)絡(luò)層第3層網(wǎng)絡(luò)層(Network)網(wǎng)絡(luò)層能夠?qū)鬏數(shù)臄?shù)據(jù)封包,然后通過路由選擇、分段組合等控制,將信息從源設(shè)備傳送到目標(biāo)設(shè)備第2層數(shù)據(jù)鏈路層(Data Link)數(shù)據(jù)鏈路層主要是

3、修正傳輸過程中的錯(cuò)誤信號(hào),它能夠提供可靠的通過物理介質(zhì)傳輸數(shù)據(jù)的方法第1層物理層(Physical)利用傳輸介質(zhì)為數(shù)據(jù)鏈路層提供物理連接,它規(guī)范了網(wǎng)絡(luò)硬件的特性、規(guī)格和傳輸速度TCP/IP參考模型TCP/IP(Transmission Control Protocal/Internet Protocal,傳輸控制協(xié)議/網(wǎng)際協(xié)議)協(xié)議是互聯(lián)網(wǎng)上最流行的協(xié)議,但它并不完全符合OSI的7層參考模型。TCP/IP通信協(xié)議采用了4層的層級(jí)結(jié)構(gòu)1.應(yīng)用層2.傳輸層3.互聯(lián)網(wǎng)絡(luò)層4.網(wǎng)絡(luò)接口層IP地址IP被稱為網(wǎng)際協(xié)議,Internet上使用的一個(gè)關(guān)鍵的底層協(xié)議就是IP協(xié)議。IP地址的范圍:類 型范 圍A類

4、0.0.0.0127.255.255.255B類128.0.0.0191.255.255.255C類192.0.0.0223.255.255.255D類224.0.0.0239.255.255.255E類240.0.0.0247.255.255.255數(shù)據(jù)包格式TCP/IP協(xié)議常用的有IP數(shù)據(jù)包、TCP數(shù)據(jù)包、UDP數(shù)據(jù)包和ICMP數(shù)據(jù)包。IP數(shù)據(jù)包TCP數(shù)據(jù)包UDP數(shù)據(jù)包ICMP數(shù)據(jù)包2 套 接 字Winsock套接字套接字是網(wǎng)絡(luò)通信的基石,是網(wǎng)絡(luò)通信的基本構(gòu)件,最初由加利福尼亞大學(xué)Berkeley學(xué)院為UNIX開發(fā)的網(wǎng)絡(luò)通信編程接口。為了在Windows操作系統(tǒng)上使用套接字,20世紀(jì)90年

5、代初,微軟和第三方廠商共同制定了一套標(biāo)準(zhǔn),即Windows Socket規(guī)范,簡稱Winsock。1993年1月起Winsock1.1成為業(yè)界的一項(xiàng)標(biāo)準(zhǔn),它為通用的TCP/IP應(yīng)用程序提供了超強(qiáng)并靈活的API,但Winsock1.1把API限定在TCP/IP的范疇里,它不像Berkerly模型一樣可以支持多種協(xié)議,所以Winsock2.0進(jìn)行了擴(kuò)展,開始支持IPX/SPX和DECNet等協(xié)議。Winsock2.0允許多種協(xié)議棧的并存,可以使應(yīng)用程序適用于不同的網(wǎng)絡(luò)名和網(wǎng)絡(luò)地址。Winsock的使用舉例:Windows系統(tǒng)提供的套接字函數(shù)通常封裝在Ws2_32.dll動(dòng)態(tài)鏈接庫中,其頭文件Win

6、sock2.h提供了套接字函數(shù)的原型,庫文件Ws2_32.lib提供了Ws2_32.dll動(dòng)態(tài)鏈接庫的輸出節(jié)。WSADATA wsd; /定義WSADATA對(duì)象WSAStartup(MAKEWORD(2,2),&wsd); /初始化套接字常用的套接字函數(shù)如下:WSAStartup函數(shù)該函數(shù)用于初始化Ws2_32.dll動(dòng)態(tài)鏈接庫。在使用套接字函數(shù)之前,一定要初始化Ws2_32.dll動(dòng)態(tài)鏈接庫。語法如下:int WSAStartup ( WORD wVersionRequested,LPWSADATA lpWSAData );wVersionRequested:表示調(diào)用者使用的Windows

7、Socket的版本,高字節(jié)記錄修訂版本,低字節(jié)記錄主版本。例如,如果Windows Socket的版本為2.1,則高字節(jié)記錄1,低字節(jié)記錄2。lpWSAData:是一個(gè)WSADATA結(jié)構(gòu)指針,該結(jié)構(gòu)詳細(xì)記錄了Windows套接字的相關(guān)信息,其定義如下:typedef struct WSAData WORD wVersion; WORD wHighVersion; char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYS_STATUS_LEN+1; unsigned short iMaxSockets; unsigned

8、short iMaxUdpDg; char FAR * lpVendorInfo; WSADATA, FAR * LPWSADATA;wVersion:調(diào)用者使用的Ws2_32.dll動(dòng)態(tài)庫的版本號(hào)。wHighVersion:Ws2_32.dll支持的最高版本,通常與wVersion相同。szDescription:套接字的描述信息,通常沒有實(shí)際意義。szSystemStatus:系統(tǒng)的配置或狀態(tài)信息,通常沒有實(shí)際意義。iMaxSockets:最多可以打開多少個(gè)套接字。在套接字版本2或以后的版本中,該成員將被忽略。iMaxUdpDg:數(shù)據(jù)包的最大長度。在套接字版本2或以后的版本中,該成員將被忽

9、略。lpVendorInfo:套接字的廠商信息。在套接字版本2或以后的版本中,該成員將被忽略。socket函數(shù)該函數(shù)用于創(chuàng)建一個(gè)套接字。語法如下:SOCKET socket ( int af,int type, int protocol );af:一個(gè)地址家族。通常為AF_INET。type:套接字類型。如果為SOCK_STREAM,表示創(chuàng)建面向連接的流式套接字,為SOCK_DGRAM,創(chuàng)建面向無連接的數(shù)據(jù)報(bào)套接字,為SOCK_RAW,表示創(chuàng)建原始套接字。對(duì)于這些值,用戶可以在Winsock2.h頭文件中找到。protocol:套接口所用的協(xié)議。如果用戶不指定,可以設(shè)置為0。返回值:函數(shù)返回值

10、是創(chuàng)建的套接字句柄。bind函數(shù)該函數(shù)用于將套接字綁定到指定的端口和地址上。語法如下:int bind (SOCKET s,const struct sockaddr FAR* name,int namelen );s:套接字標(biāo)識(shí)。name:一個(gè)sockaddr結(jié)構(gòu)指針。該結(jié)構(gòu)中包含了要結(jié)合的地址和端口號(hào)。namelen:確定name緩沖區(qū)的長度。返回值:如果函數(shù)執(zhí)行成功,返回值為0,否則為SOCKET_ERROR。listen函數(shù)該函數(shù)用于將套接字設(shè)置為監(jiān)聽模式。對(duì)于流式套接字,必須處于監(jiān)聽模式才能夠接收客戶端套接字的連接。語法如下:int listen ( SOCKET s, int ba

11、cklog);s:套接字標(biāo)識(shí)。backlog:等待連接的最大隊(duì)列長度。例如,如果backlog被設(shè)置為2,此時(shí)有3個(gè)客戶端同時(shí)發(fā)出連接請(qǐng)求,那么前兩個(gè)客戶端連接會(huì)放置在等待隊(duì)列中,第3個(gè)客戶端會(huì)得到錯(cuò)誤信息。accept函數(shù)該函數(shù)用于接受客戶端的連接。在流式套接字中,套接字處于監(jiān)聽狀態(tài)才能接受客戶端的連接。語法如下:SOCKET accept ( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen );s:是一個(gè)套接字,它應(yīng)處于監(jiān)聽狀態(tài)。addr:是一個(gè)sockaddr_in結(jié)構(gòu)指針,包含一組客戶端的端口號(hào)、IP地址等信息。addrlen

12、:用于接收參數(shù)addr的長度。返回值:一個(gè)新的套接字,它對(duì)應(yīng)于已經(jīng)接受的客戶端連接,對(duì)于該客戶端的所有后續(xù)操作,都應(yīng)使用這個(gè)新的套接字。closesocket函數(shù)該函數(shù)用于關(guān)閉套接字。語法如下:int closesocket (SOCKET s);s:標(biāo)識(shí)一個(gè)套接字。如果參數(shù)s設(shè)置有SO_DONTLINGER選項(xiàng),則調(diào)用該函數(shù)后會(huì)立即返回,但此時(shí)如果有數(shù)據(jù)尚未傳送完畢,會(huì)繼續(xù)傳遞數(shù)據(jù),然后才關(guān)閉套接字。connect函數(shù)該函數(shù)用于發(fā)送一個(gè)連接請(qǐng)求。語法如下:int connect (SOCKET s,const struct sockaddr FAR* name,int namelen );s

13、:是一個(gè)套接字。name:套接字s想要連接的主機(jī)地址和端口號(hào)。namelen:name緩沖區(qū)的長度。返回值:如果函數(shù)執(zhí)行成功,返回值為0,否則為SOCKET_ERROR。用戶可以通過WSAGETLASTERROR得到其錯(cuò)誤描述。htons函數(shù)該函數(shù)將一個(gè)16位的無符號(hào)短整型數(shù)據(jù)由主機(jī)排列方式轉(zhuǎn)換為網(wǎng)絡(luò)排列方式。語法如下:u_short htons (u_short hostshort );hostshort:一個(gè)主機(jī)排列方式的無符號(hào)短整型數(shù)據(jù)。返回值:是16位的網(wǎng)絡(luò)排列方式數(shù)據(jù)。htonl函數(shù)該函數(shù)將一個(gè)無符號(hào)長整型數(shù)據(jù)由主機(jī)排列方式轉(zhuǎn)換為網(wǎng)絡(luò)排列方式。語法如下:u_long htonl (

14、u_long hostlong);hostlong:一個(gè)主機(jī)排列方式的無符號(hào)長整型數(shù)據(jù)。返回值:32位的網(wǎng)絡(luò)排列方式數(shù)據(jù)。inet_addr函數(shù)該函數(shù)將一個(gè)由字符串表示的地址轉(zhuǎn)換為32位的無符號(hào)長整型數(shù)據(jù)。語法如下:unsigned long inet_addr (const char FAR * cp);cp:一個(gè)IP地址的字符串。返回值:32位無符號(hào)長整數(shù)。recv函數(shù)該函數(shù)用于從面向連接的套接字中接收數(shù)據(jù)。語法如下:int recv (SOCKET s,char FAR* buf,int len,int flags);s:一個(gè)套接字。buf:接收數(shù)據(jù)的緩沖區(qū)。len:buf的長度。fla

15、gs:函數(shù)的調(diào)用方式。如果為MSG_PEEK,表示查看傳來的數(shù)據(jù),在序列前端的數(shù)據(jù)會(huì)被復(fù)制一份到返回緩沖區(qū)中,但是這個(gè)數(shù)據(jù)不會(huì)從序列中移走。如果為MSG_OOB,表示用來處理Out-Of-Band數(shù)據(jù),也就是外帶數(shù)據(jù)。send函數(shù)該函數(shù)用于在面向連接方式的套接字間發(fā)送數(shù)據(jù)。語法如下:int send (SOCKET s,const char FAR * buf, int len,int flags);s:一個(gè)套接字。buf:存放要發(fā)送數(shù)據(jù)的緩沖區(qū)。len:緩沖區(qū)長度。flags:函數(shù)的調(diào)用方式。select函數(shù)該函數(shù)用來檢查一個(gè)或多個(gè)套接字是否處于可讀、可寫或錯(cuò)誤狀態(tài)。該函數(shù)語法如下:int

16、select (int nfds,fd_set FAR * readfds,fd_set FAR * writefds,fd_set FAR * exceptfds, const struct timeval FAR * timeout);nfds:無實(shí)際意義,只是為了和Unix下的套接字兼容。readfds:一組被檢查可讀的套接字。writefds:一組被檢查可寫的套接字。exceptfds:被檢查有錯(cuò)誤的套接字。timeout:函數(shù)的等待時(shí)間。WSACleanup函數(shù)該函數(shù)用于釋放為Ws2_32.dll動(dòng)態(tài)鏈接庫初始化時(shí)分配的資源。語法如下:int WSACleanup (void);WS

17、AAsyncSelect函數(shù)該函數(shù)用于將網(wǎng)絡(luò)中發(fā)生的事件關(guān)聯(lián)到窗口的某個(gè)消息中。語法如下:int WSAAsyncSelect (SOCKET s, HWND hWnd,unsigned int wMsg,long lEvent);s:一個(gè)套接字。hWnd:接收消息的窗口句柄。wMsg:窗口接收來自套接字中的消息。lEvent:網(wǎng)絡(luò)中發(fā)生的事件。ioctlsocket函數(shù)該函數(shù)用于設(shè)置套接字的I/O模式。語法如下:int ioctlsocket(SOCKET s,long cmd,u_long FAR* argp);s:待更改I/O模式的套接字。cmd:對(duì)套接字的操作命令。如果為FIONBIO

18、,當(dāng)argp為0時(shí),表示禁止非阻塞模式,當(dāng)argp非0時(shí),表示設(shè)置非阻塞模式。如果為FIONREAD,表示從套接字中可以讀取的數(shù)據(jù)量。如果為SIOCATMARK,表示所有的外帶數(shù)據(jù)都已被讀入。這個(gè)命令僅適用于流式套接字,并且該套接字已被設(shè)置為可以在線接收外帶數(shù)據(jù)(SO_OOBINLINE)。argp:命令參數(shù)。以下是Winsock2.0新增的函數(shù):WSAAccept():accept()函數(shù)擴(kuò)展版本,它支持條件接收和套接口分組。WSACloseEvent():釋放一個(gè)事件對(duì)象。WSAConnect():connect()函數(shù)的擴(kuò)展版本,它支持連接數(shù)據(jù)交換和Qos規(guī)范。WSACreateEven

19、t():創(chuàng)建一個(gè)事件對(duì)象。WSADuplicateSocket():為一個(gè)共享套接口創(chuàng)建一個(gè)新的套接口描述字。WSAEnumNetworkEvents():檢查是否有網(wǎng)絡(luò)事件發(fā)生。WSAEnumProtocols():得到每個(gè)可以使用的協(xié)議信息。WSAEventSelect():把網(wǎng)絡(luò)事件和一個(gè)事件對(duì)象連接。WSAGetOverlappedResu():得到重疊操作的完成狀態(tài)。WSAGetQOSByName():對(duì)于一個(gè)傳輸協(xié)議服務(wù)名字提供相應(yīng)的QoS參數(shù)。WSAHtonl():htonl()函數(shù)的擴(kuò)展版本。WSAHtons():htons()函數(shù)的擴(kuò)展版本。WSAIoctl():ioctls

20、ocket()函數(shù)的允許重疊操作的版本。WSAJoinLeaf():在多點(diǎn)對(duì)話中計(jì)入一個(gè)葉節(jié)點(diǎn)。WSANtohl():ntohl()函數(shù)的擴(kuò)展版本。WSANtohs():ntohs()函數(shù)的擴(kuò)展版本。WSARecv():recv()函數(shù)的擴(kuò)展版本,它支持分散/聚焦I/O和沖抵套接口操作。WSARecvDisconnect():終止套接口的接收操作。如果套接口是基于連接的,得到拆除數(shù)據(jù)。WSARecvFrom():recvfrom()函數(shù)的擴(kuò)展版本,它支持分散/聚焦I/O和沖抵套接口操作。WSAResetEvnet():重新初始化一個(gè)數(shù)據(jù)對(duì)象。WSASend():send()函數(shù)的擴(kuò)展版本,它支

21、持分散/聚焦I/O和沖抵套接口操作。WSASendDisconnect():啟動(dòng)一系列拆除套接口連接的操作,并且可以選擇發(fā)送拆除數(shù)據(jù)。WSASendTo():sendto()函數(shù)的擴(kuò)展版本,它支持分散/聚焦I/O和沖抵套接口操作。WSASetEvent():設(shè)置一個(gè)數(shù)據(jù)對(duì)象。WSASocket():socket()函數(shù)的擴(kuò)展版本,它以一個(gè)PROTOCOL_INFO結(jié)構(gòu)作為輸入?yún)?shù)并且允許創(chuàng)建重疊套接口,它還允許創(chuàng)建套接口組。WSAWaitFoMultipleEvent():阻塞多個(gè)事件對(duì)象。套接字阻塞模式依據(jù)套接字函數(shù)執(zhí)行方式的不同,可以將套接字分為兩類,即阻塞套接字和非阻塞套接字。在阻塞套接

22、字中,套接字函數(shù)的執(zhí)行會(huì)一直等待,直到函數(shù)調(diào)用完成才返回。下面的代碼在創(chuàng)建一個(gè)套接字后,將套接字設(shè)置為非阻塞套接字。unsigned long nCmd;SOCKET clientSock = socket(AF_INET, SOCK_STREAM, 0);/創(chuàng)建套接字int nState = ioctlsocket(clientSock, FIONBIO, &nCmd);/設(shè)置非阻塞模式if (nState != 0)/設(shè)置套接字非阻塞模式失敗TRACE(設(shè)置套接字非阻塞模式失敗);字節(jié)順序有時(shí)不同的計(jì)算機(jī)結(jié)構(gòu)使用不同的字節(jié)順序存儲(chǔ)數(shù)據(jù),例如基于Intel的計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)的順序與 Macintosh (Motorola) 計(jì)算機(jī)相反。通常,用戶不必為在網(wǎng)絡(luò)上發(fā)送和接收數(shù)據(jù)的字節(jié)順序轉(zhuǎn)換擔(dān)心,但在有些情況下,必須轉(zhuǎn)換字節(jié)順序。例如,程序中將指定的整數(shù)設(shè)置為套接字的端口號(hào),在綁定端口號(hào)之前,必須將端口號(hào)從主機(jī)順序轉(zhuǎn)換為網(wǎng)絡(luò)順序。

溫馨提示

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

評(píng)論

0/150

提交評(píng)論