TCP(IP)協(xié)議與網(wǎng)絡(luò)編程課件_第1頁
TCP(IP)協(xié)議與網(wǎng)絡(luò)編程課件_第2頁
TCP(IP)協(xié)議與網(wǎng)絡(luò)編程課件_第3頁
TCP(IP)協(xié)議與網(wǎng)絡(luò)編程課件_第4頁
TCP(IP)協(xié)議與網(wǎng)絡(luò)編程課件_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、7/23/2022TCP/IP協(xié)議與網(wǎng)絡(luò)編程Version1.02010年6月7/23/2022Overview課程介紹計算機網(wǎng)絡(luò)簡介OSI七層參考模型TCP/IP模型SOCKET介紹基于TCP的SOCKET編程基于UDP的SOCKET編程參考資料 7/23/20222課程目標預備知識目標聽眾日程表詞匯表課程介紹7/23/20223了解計算機網(wǎng)絡(luò)的構(gòu)成了解OSI七層網(wǎng)絡(luò)模型了解TCP/IP網(wǎng)絡(luò)模型理解SOCKET能使用SOCKET進行網(wǎng)絡(luò)編程課程目標7/23/20224C+語言基礎(chǔ)對計算機網(wǎng)絡(luò)以及網(wǎng)絡(luò)編程有一定了解預備知識7/23/20225程序員目標聽眾7/23/20226共計:0.5天詳細

2、安排課程介紹 計算機網(wǎng)絡(luò)簡介OSI七層網(wǎng)絡(luò)模型介紹TCP/IP網(wǎng)絡(luò)模型介紹SOCKET介紹TCP編程UDP編程Total: hours日程表7/23/20227OSI-Open System InterconnectionTCP/IP-Transmission Control Protocol / Internet Protocol SOCKET-套接字詞匯表7/23/20228Overview課程介紹計算機網(wǎng)絡(luò)簡介OSI七層參考模型TCP/IP模型SOCKET介紹基于TCP的SOCKET編程基于UDP的SOCKET編程參考資料 7/23/20229計算機網(wǎng)絡(luò)是指將有獨立功能的多臺計算機,通過

3、通信設(shè)備線路連接起來,在網(wǎng)絡(luò)軟件的支持下,實現(xiàn)彼此之間資源共享和數(shù)據(jù)通信的整個系統(tǒng)。 什么是計算機網(wǎng)絡(luò)?7/23/202210計算機網(wǎng)絡(luò)的基本功能是數(shù)據(jù)通信和資源共享。 計算機網(wǎng)絡(luò)的基本功能7/23/202211按照覆蓋范圍可分為:局域網(wǎng)城域網(wǎng)廣域網(wǎng)按照介質(zhì)課分為:有線網(wǎng)絡(luò)無線網(wǎng)絡(luò)微波網(wǎng)絡(luò)問題:校園網(wǎng)屬于什么網(wǎng)絡(luò)?計算機網(wǎng)絡(luò)的分類7/23/202212AB網(wǎng)絡(luò)180協(xié)議協(xié)議端口號端口號計算機網(wǎng)絡(luò)如何進行通信7/23/202213IP網(wǎng)絡(luò)中每臺主機都必須有一個惟一的IP地址;IP地址是一個邏輯地址;因特網(wǎng)上的IP地址具有全球唯一性;32位,4個字節(jié),常用點分十進制的格式表示,例如:6IP地址7/

4、23/202214為進行網(wǎng)絡(luò)中的數(shù)據(jù)交換(通信)而建立的規(guī)則、標準或約定。(=語義+語法+規(guī)則) 不同層具有各自不同的協(xié)議。協(xié)議7/23/202215多種通信媒介有線、無線不同種類的設(shè)備通用、專用不同的操作系統(tǒng)Unix、Windows 不同的應(yīng)用環(huán)境固定、移動不同業(yè)務(wù)種類分時、交互、實時用戶業(yè)務(wù)的延續(xù)性不允許出現(xiàn)大的跌宕起伏。他們相互交織,構(gòu)成了非常復雜的網(wǎng)絡(luò)環(huán)境網(wǎng)絡(luò)異質(zhì)性7/23/202216網(wǎng)絡(luò)體系結(jié)構(gòu)解決異質(zhì)性問題采用的是分層方法 把復雜的網(wǎng)絡(luò)互聯(lián)問題劃分為若干個較小的、單一的問題,在不同層上予以解決。網(wǎng)絡(luò)異質(zhì)性的解決7/23/202217Overview課程介紹計算機網(wǎng)絡(luò)簡介OSI七層

5、參考模型TCP/IP模型SOCKET介紹基于TCP的SOCKET編程基于UDP的SOCKET編程參考資料 7/23/202218OSI(Open System Interconnection)參考模型將網(wǎng)絡(luò)的不同功能劃分為7層。OSI七層參考模型應(yīng)用層表示層物理層會話層傳輸層網(wǎng)絡(luò)層數(shù)據(jù)鏈路層處理網(wǎng)絡(luò)應(yīng)用數(shù)據(jù)表示主機間通信端到端的連接尋址和最短路徑介質(zhì)訪問(接入)二進制傳輸7/23/202219通信實體的對等層之間不允許直接通信。各層之間是嚴格單向依賴。上層使用下層提供的服務(wù) Service user;下層向上層提供服務(wù) Service provider。OSI七層參考模型7/23/202220

6、網(wǎng)絡(luò)對等通信示例我們是朋友We are friend傳真中國人翻譯秘書私友 We are friend傳真日本人翻譯秘書對交談內(nèi)容的共識用英語對話使用傳真通信物理通信線路7/23/202221對等層實體之間虛擬通信。下層向上層提供服務(wù),實際通信在最底層完成。網(wǎng)絡(luò)對等通信的實質(zhì)7/23/202222應(yīng)用層:遠程登錄協(xié)議Telnet文件傳輸協(xié)議FTP超文本傳輸協(xié)議HTTP域名服務(wù)DNS簡單郵件傳輸協(xié)議SMTP郵局協(xié)議POP3OSI各層使用協(xié)議簡介7/23/202223傳輸層:傳輸控制協(xié)議TCP:面向連接的可靠的傳輸協(xié)議用戶數(shù)據(jù)報協(xié)議UDP:是無連接的,不可靠的傳輸協(xié)議OSI各層使用協(xié)議簡介7/23

7、/202224網(wǎng)絡(luò)層:網(wǎng)際協(xié)議IPInternet互聯(lián)網(wǎng)控制報文協(xié)議ICMPInternet組管理協(xié)議IGMPOSI各層使用協(xié)議簡介7/23/202225一臺計算機要發(fā)送數(shù)據(jù)到另一臺計算機,數(shù)據(jù)首先必須打包,打包的過程稱為封裝。封裝就是在數(shù)據(jù)前面加上特定的協(xié)議頭部。數(shù)據(jù)封裝數(shù)據(jù)數(shù)據(jù)協(xié)議頭7/23/202226OSI參考模型中,對等層協(xié)議之間交換的信息單元統(tǒng)稱為協(xié)議數(shù)據(jù)單元(PDU,Protocol Data Unit)。OSI參考模型中每一層都要依靠下一層提供的服務(wù)。為了提供服務(wù),下層把上層的PDU作為本層的數(shù)據(jù)封裝,然后加入本層的頭部(和尾部)。頭部中含有完成數(shù)據(jù)傳輸所需的控制信息。數(shù)據(jù)封裝

8、7/23/202227數(shù)據(jù)自上而下遞交的過程實際上就是不斷封裝的過程。到達目的地后自下而上遞交的過程就是不斷拆封的過程。由此可知,在物理線路上傳輸?shù)臄?shù)據(jù),其外面實際上被包封了多層“信封”。某一層只能識別由對等層封裝的“信封”,而對于被封裝在“信封”內(nèi)部的數(shù)據(jù)僅僅是拆封后將其提交給上層,本層不作任何處理。數(shù)據(jù)封裝7/23/202228Overview課程介紹計算機網(wǎng)絡(luò)簡介OSI七層參考模型TCP/IP模型SOCKET介紹基于TCP的SOCKET編程基于UDP的SOCKET編程參考資料 7/23/202229TCP/IP起源于美國國防部高級研究規(guī)劃署(DARPA)的一項研究計劃實現(xiàn)若干臺主機的相互

9、通信?,F(xiàn)在TCP/IP已成為Internet上通信的工業(yè)標準。TCP/IP模型7/23/202230TCP/IP模型包括4個層次:應(yīng)用層傳輸層網(wǎng)絡(luò)層網(wǎng)絡(luò)接口TCP/IP模型的分層7/23/202231TCP/IP與OSI的對應(yīng)關(guān)系應(yīng)用層表示層會話層傳輸層物理層數(shù)據(jù)鏈路層網(wǎng)絡(luò)層7654321OSI參考模型應(yīng)用層傳輸層網(wǎng)絡(luò)接口網(wǎng)絡(luò)層TCP/IP模型7/23/202232按照OSI七層模型的描述,傳輸層提供進程(應(yīng)用程序)通信的能力。為 了標識通信實體中進行通信的進程(應(yīng)用程序),TCP/IP協(xié)議提出了協(xié)議端口(protocol port,簡稱端口)的概念。端口是一種抽象的軟件結(jié)構(gòu)。應(yīng)用程序通過系統(tǒng)

10、調(diào)用與某端口建立連接(binding)后,傳輸層傳給該端口的數(shù)據(jù)都被相應(yīng)的進程所接收,相應(yīng)進程發(fā)給傳輸層的數(shù)據(jù)都通過該端口輸出。端口7/23/202233端口用一個整數(shù)型標識符來表示,即端口號。端口號跟協(xié)議相關(guān),TCP/IP傳輸層的兩個協(xié)議TCP和UDP是完全獨立的兩個軟件模塊,因此各自的端口號也相互獨立。端口使用一個16位的數(shù)字來表示,它的范圍是065535,1024以下的端口號保留給預定義的服務(wù)。例如:http使用80端口。端口7/23/202234Overview課程介紹計算機網(wǎng)絡(luò)簡介OSI七層參考模型TCP/IP模型SOCKET介紹基于TCP的SOCKET編程基于UDP的SOCKET編

11、程參考資料 7/23/202235我們開發(fā)網(wǎng)絡(luò)應(yīng)用程序是否需要我們手工的去封裝我們需要傳輸?shù)臄?shù)據(jù)?如何開發(fā)網(wǎng)絡(luò)應(yīng)用程序7/23/202236為了能夠方便的開發(fā)網(wǎng)絡(luò)應(yīng)用軟件,由美國伯克利大學在Unix上推出了一種應(yīng)用程序訪問通信協(xié)議的操作系統(tǒng)調(diào)用socket(套接字)。socket的出現(xiàn),使程序員可以很方便地訪問TCP/IP,從而開發(fā)各種網(wǎng)絡(luò)應(yīng)用的程序。SOCKET-套接字的引入7/23/202237隨著Unix的應(yīng)用推廣,套接字在編寫網(wǎng)絡(luò)軟件中得到了極大的普及。后來,套接字又被引進了Windows等操作系統(tǒng),成為開發(fā)網(wǎng)絡(luò)應(yīng)用程序的非常有效快捷的工具。SOCKET-套接字的引入7/23/2022

12、38套接字存在于通信區(qū)域中。通信區(qū)域也叫地址族,它是一個抽象的概念,主要用于將通過套接字通信的進程的共有特性綜合在一起。套接字通常只與同一區(qū)域的套接字交換數(shù)據(jù)(也有可能跨區(qū)域通信,但這只在執(zhí)行了某種轉(zhuǎn)換進程后才能實現(xiàn))。Windows Sockets只支持一個通信區(qū)域:網(wǎng)際域( AF_INET),這個域被使用網(wǎng)際協(xié)議簇通信的進程使用。SOCKET-套接字的引入7/23/202239在TCP/IP網(wǎng)絡(luò)應(yīng)用中,通信的兩個進程間相互作用的主要模式是客戶機/服務(wù)器模式(client/server),即客戶向服務(wù)器提出請求,服務(wù)器接收到請求后,提供相應(yīng)的服務(wù)??蛻魴C/服務(wù)器模式7/23/202240客戶

13、機/服務(wù)器模式的建立基于以下兩點:首先,建立網(wǎng)絡(luò)的起因是網(wǎng)絡(luò)中軟硬件資源、運算能力和信息不均等,需要共享,從而造就擁有眾多資源的主機提供服務(wù),資源較少的客戶請求服務(wù)這一非對等作用。其次,網(wǎng)間進程通信完全是異步的,相互通信的進程間既不存在父子關(guān)系,又不共享內(nèi)存緩沖區(qū),因此需要一種機制為希望通信的進程間建立聯(lián)系,為二者的數(shù)據(jù)交換提供同步,這就是基于客戶機/服務(wù)器模式的TCP/IP??蛻魴C/服務(wù)器模式7/23/202241客戶機/服務(wù)器模式在操作過程中采取的是主動請求的方式。服務(wù)器端:首先服務(wù)器方要先啟動,并根據(jù)請求提供相應(yīng)的服務(wù):打開一個通信通道并告知本地主機,它愿意在某一地址和端口上接收客戶請求

14、。等待客戶請求到達該端口。接收到重復服務(wù)請求,處理該請求并發(fā)送應(yīng)答信號。接收到并發(fā)服務(wù)請求,要激活一個新的進程(或線程)來處理這個客戶請求。新進程(或線程) 處理此客戶請求,并不需要對其它請求作出應(yīng)答。服務(wù)完成后,關(guān)閉此新進程與客戶的通信鏈路,并終止。返回第二步,等待另一客戶請求。關(guān)閉服務(wù)器??蛻魴C/服務(wù)器模式7/23/202242客戶方:打開一個通信通道,并連接到服務(wù)器所在主機的特定端口。向服務(wù)器發(fā)服務(wù)請求報文,等待并接收應(yīng)答;繼續(xù)提出請求。請求結(jié)束后關(guān)閉通信通道并終止。客戶機/服務(wù)器模式7/23/202243Windows Sockets是Microsoft Windows的網(wǎng)絡(luò)程序設(shè)計接

15、口,它是從Berkeley Sockets擴展而來的,以動態(tài)鏈接庫的形式提供給我們使用。Windows Sockets在繼承了Berkeley Sockets主要特征的基礎(chǔ)上,又對它進行了重要擴充。這些擴充主要是提供了一些異步函數(shù),并增加了符合Windows消息驅(qū)動特性的網(wǎng)絡(luò)事件異步選擇機制。Windows Socket的實現(xiàn)7/23/202244Windows Sockets 1.1和Berkeley Sockets都是基于TCP/IP協(xié)議的;Windows Sockets 2從Windows Sockets 1.1發(fā)展而來,與協(xié)議無關(guān)并向下兼容,可以使用任何底層傳輸協(xié)議提供的通信能力,來為

16、上層應(yīng)用程序完成網(wǎng)絡(luò)數(shù)據(jù)通訊,而不關(guān)心底層網(wǎng)絡(luò)鏈路的通訊情況,真正實現(xiàn)了底層網(wǎng)絡(luò)通訊對應(yīng)用程序的透明。Windows Socket的實現(xiàn)7/23/202245流式套接字(SOCK_STREAM)提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯、無重復的發(fā)送,且按發(fā)送順序接收。數(shù)據(jù)報式套接字(SOCK_DGRAM)提供無連接服務(wù)。數(shù)據(jù)包以獨立包形式發(fā)送,不提供無錯保證,數(shù)據(jù)可能丟失或重復,并且接收順序混亂。原始套接字(SOCK_RAW)。Socket類型7/23/202246Overview課程介紹計算機網(wǎng)絡(luò)簡介OSI七層參考模型TCP/IP模型SOCKET介紹基于TCP的SOCKET編程基于UDP

17、的SOCKET編程參考資料 7/23/202247基于TCP的SOCKET編程服務(wù)器端程序:1、創(chuàng)建套接字(socket)。2、將套接字綁定到一個本地地址和端口上(bind)。3、將套接字設(shè)為監(jiān)聽模式,準備接收客戶請求(listen)。4、等待客戶請求到來;當請求到來后,接受連接請求,返回一個新的對應(yīng)于此次連接的套接字(accept)。5、用返回的套接字和客戶端進行通信(send/recv)。6、返回,等待另一客戶請求。7、關(guān)閉套接字??蛻舳顺绦颍?、創(chuàng)建套接字(socket)。2、向服務(wù)器發(fā)出連接請求(connect)。3、和服務(wù)器端進行通信(send/recv)。4、關(guān)閉套接字。7/23/

18、202248初始化SOCKETint WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );參數(shù)說明 :wVersionRequested參數(shù)用于指定準備加載的Winsock庫的版本。高位字節(jié)指定所需要的Winsock庫的副版本,而低位字節(jié)則是主版本??捎肕AKEWORD(x,y)(其中,x是高位字節(jié),y是低位字節(jié))方便地獲得wVersionRequested的正確值。 lpWSAData參數(shù)是指向WSADATA結(jié)構(gòu)的指針,WSAStartup用其加載的庫版本有關(guān)的信息填在這個結(jié)構(gòu)中。相關(guān)函數(shù)說明7/23/202249WSADATA

19、結(jié)構(gòu)定義如下:typedef struct WSAData WORD wVersion; WORD wHighVersion; char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYS_STATUS_LEN+1; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; WSADATA, *LPWSADATA;相關(guān)函數(shù)說明7/23/202250WSADATA各個字段說明:WSAStartup把第一個字段wVersion設(shè)成

20、打算使用的Winsock版本。wHighVersion 參數(shù)容納的是現(xiàn)有的Winsock庫的最高版本。記住,這兩個字段中,高位字節(jié)代表的是Winsock副版本,而低位字節(jié)代表的則是Winsock主版本。szDescription和szSystemStatus這兩個字段由特定的Winsock實施方案設(shè)定,事實上沒有用。相關(guān)函數(shù)說明7/23/202251不要使用下面這兩個字段:iMaxSockets和iMaxUdpDg,它們是假定同時最多可打開多少套接字和數(shù)據(jù)報的最大長度。然而,要知道數(shù)據(jù)報的最大長度應(yīng)該通過WSAEnumProtocols來查詢協(xié)議信息。同時最多可打開套接字的數(shù)目不是固定的,很大

21、程度上和可用物理內(nèi)存的多少有關(guān)。最后,lpVendorInfo字段是為Winsock實施方案有關(guān)的指定廠商信息預留的。任何一個Win32平臺上都沒有使用這個字段。相關(guān)函數(shù)說明7/23/202252如果WinSock.dll或底層網(wǎng)絡(luò)子系統(tǒng)沒有被正確初始化或沒有被找到,WSAStartup將返回WSASYSNOTREADY。此外這個函數(shù)允許你的應(yīng)用程序協(xié)商使用某種版本的WinSock規(guī)范,如果請求的版本等于或高于DLL所支持的最低版本,WSAData的wVersion成員中將包含你的應(yīng)用程序應(yīng)該使用的版本,它是DLL所支持的最高版本與請求版本中較小的那個。反之,如果請求的版本低于DLL所支持的最

22、低版本,WSAStartup將返回WSAVERNOTSUPPORTED。關(guān)于WSAStartup更詳細的信息,請查閱MSDN中的相關(guān)部分。 對于每一個WSAStartup的成功調(diào)用(成功加載WinSock DLL后),在最后都對應(yīng)一個WSACleanUp調(diào)用,以便釋放為該應(yīng)用程序分配的資源。相關(guān)函數(shù)說明7/23/202253WSAStartup 用法WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &ws

23、aData );if ( err != 0 ) return;if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( );return; 相關(guān)函數(shù)說明7/23/202254創(chuàng)建套接字SOCKET socket ( int af, int type, int protocol ); 參數(shù)說明1、第一個參數(shù)af指定地址族,對于TCP/IP協(xié)議的套接字,它只能是AF_INET(也可寫成PF_INET)。2、第二個參數(shù)指定Socket類型,對于1.1版本的Socket,它只支持兩種類型的套

24、接字,SOCK_STREAM指定產(chǎn)生流式套接字,SOCK_DGRAM產(chǎn)生數(shù)據(jù)報套接字。3、第三個參數(shù)是與特定的地址家族相關(guān)的協(xié)議,如果指定為0,那么它就會根據(jù)地址格式和套接字類別,自動為你選擇一個合適的協(xié)議。這是推薦使用的一種選擇協(xié)議的方法。相關(guān)函數(shù)說明7/23/202255返回值如果這個函數(shù)調(diào)用成功,它將返回一個新的SOCKET數(shù)據(jù)類型的套接字描述符。如果調(diào)用失敗,這個函數(shù)就會返回一個INVALID_SOCKET,錯誤信息可以通過WSAGetLastError函數(shù)返回。 相關(guān)函數(shù)說明7/23/202256綁定套接字int bind ( SOCKET s, const struct socka

25、ddr FAR* name, int namelen ); 參數(shù)說明:1、第一個參數(shù)s指定要綁定的套接字,2、第二個參數(shù)指定了該套接字的本地地址信息,是指向sockaddr結(jié)構(gòu)的指針變量,3、由于該地址結(jié)構(gòu)是為所有的地址家族準備的,這個結(jié)構(gòu)可能(通常會)隨所使用的網(wǎng)絡(luò)協(xié)議不同而不同,所以,要用第三個參數(shù)指定該地址結(jié)構(gòu)的長度。 相關(guān)函數(shù)說明7/23/202257返回值如果沒有發(fā)生錯誤,那么bind函數(shù)將返回0;如果這個函數(shù)調(diào)用失敗,那么將返回SOCKET_ERROR,錯誤信息可以通過WSAGetLastError函數(shù)返回。 相關(guān)函數(shù)說明7/23/202258Sockaddr結(jié)構(gòu)體說明struct

26、 sockaddr u_short sa_family; char sa_data14; ; sockaddr的第一個字段sa_family指定該地址家族,在這里必須設(shè)為AF_INET; sa_data僅僅是表示要求一塊內(nèi)存分配區(qū),起到占位的作用,該區(qū)域中指定與協(xié)議相關(guān)的具體地址信息。相關(guān)函數(shù)說明7/23/202259Sockaddr_in結(jié)構(gòu)體說明由于實際要求的只是內(nèi)存區(qū),所以對于不同的協(xié)議家族,用不同的結(jié)構(gòu)來替換sockaddr。除了sa_family外,sockaddr是按網(wǎng)絡(luò)字節(jié)順序表示的。在TCP/IP中,我們可以用sockaddr_in結(jié)構(gòu)替換sockaddr,以方便我們填寫地址信

27、息。 相關(guān)函數(shù)說明7/23/202260struct sockaddr_in short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero8; ; 相關(guān)函數(shù)說明7/23/202261sin_family表示地址族,對于IP地址,sin_family成員將一直是AF_INET。sin_port指定的是將要分配給套接字的端口。sin_addr給出的是套接字的主機IP地址。sin_zero只是一個填充數(shù),以使sockaddr_in結(jié)構(gòu)和sockaddr結(jié)構(gòu)的長度一樣。對于sin_addr,將其指定為

28、INADDR_ANY。允許套接字向任何分配給本地機器的IP地址發(fā)送或接收數(shù)據(jù)。一般情況下一臺機器都只有一個IP地址,但是多于一臺機器有多個網(wǎng)卡,而每個網(wǎng)卡都有一個IP。用INADDR_ANY可以簡化應(yīng)用程序的編寫。將地址指定為INADDR_ANY,允許一個獨立應(yīng)用接受發(fā)自多個接口的回應(yīng)。相關(guān)函數(shù)說明7/23/202262監(jiān)聽套接字int listen ( SOCKET s, int backlog ); 參數(shù)說明:s:需要監(jiān)聽的套接字backlog:最大連接數(shù)返回值:如果沒有錯誤發(fā)生返回0;否則返回SOCKET_ERROR相關(guān)函數(shù)說明7/23/202263接收請求SOCKET accept (

29、 SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen ); 參數(shù)說明:s:接收請求的套接字addr:發(fā)送請求的地址addrlen:地址長度返回值:如果沒有錯誤發(fā)生則返回一個新的套接字;否則返回INVALID_SOCKET 相關(guān)函數(shù)說明7/23/202264接收數(shù)據(jù)int recv ( SOCKET s, char FAR* buf, int len, int flags ); 參數(shù)說明:s:接收端套接字buf:發(fā)送字符串len:發(fā)送長度flags:一般設(shè)置為0,課在MSDN上查詢具體含義返回值:如果執(zhí)行成功,則返回接收數(shù)據(jù)的長度;如果連接

30、關(guān)閉則返回0;否則返回SOCKET_ERROR 相關(guān)函數(shù)說明7/23/202265發(fā)送數(shù)據(jù)int send ( SOCKET s, const char FAR * buf, int len, int flags );參數(shù)說明:s: 發(fā)送端套接字buf:發(fā)送字符串len:發(fā)送字符長度。一般多發(fā)送一個字符flags:一般設(shè)置為0.返回值:執(zhí)行成功則返回總共發(fā)送的字節(jié)數(shù);否者返回SOCKET_ERROR 相關(guān)函數(shù)說明7/23/202266連接服務(wù)器int connect ( SOCKET s, const struct sockaddr FAR* name, int namelen ); 參數(shù)說明

31、:s:請求連接套接字name:服務(wù)器地址namelen:服務(wù)器地址長度。返回值:如果執(zhí)行成功,則返回0;否則返回SOCKET_ERROR相關(guān)函數(shù)說明7/23/202267轉(zhuǎn)換函數(shù)u_long htonl ( u_long hostlong ); 返回一個32位的TCP/IP的網(wǎng)絡(luò)字節(jié)序。u_short htons ( u_short hostshort );返回一個16位的TCP/IP網(wǎng)絡(luò)字節(jié)序。 例:SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_port=htons(6000);a

32、ddrSrv.sin_family=AF_INET;相關(guān)函數(shù)說明7/23/202268unsigned long inet_addr ( const char FAR * cp );將一個以點分十進制的IP地址轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序。 char FAR * inet_ntoa ( struct in_addr in ); 將一個網(wǎng)絡(luò)字節(jié)序的IP地址轉(zhuǎn)化為以點分十進制表示的IP地址。例:addrSrv.sin_addr.S_un.S_addr=inet_addr();inet_ntoa(addrSrv.sin_addr);相關(guān)函數(shù)說明7/23/202269包含頭文件:#include需要添加連接庫:w

33、s2_32.lib需要的頭文件和引用7/23/202270服務(wù)器端:SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);/創(chuàng)建套接字SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);/綁定套接字bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR);listen(sockSrv,5);/監(jiān)聽套接字SOCKADDR_IN

34、addrClient;int len=sizeof(SOCKADDR);TCP編程實例7/23/202271while (1)SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);/接收套接字請求char sendBuf100;sprintf(sendBuf,Welcome,inet_ntoa(addrClient.sin_addr);send(sockConn,sendBuf,strlen(sendBuf)+1,0);/發(fā)送消息char recvBuf100;recv(sockConn,recvBuf,100,0);/接收消息

35、printf(%sn,recvBuf);closesocket(sockConn);/關(guān)閉套接字連接TCP編程實例7/23/202272客戶端/創(chuàng)建套接字SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;/定義服務(wù)器地址addrSrv.sin_addr.S_un.S_addr=inet_addr();addrSrv.sin_family=AF_INET;addrSrv.sin_port =htons(6000);/設(shè)定端口connect(sockClient,(SOCKADDR*)&addrSrv,sizeo

36、f(SOCKADDR);/連接服務(wù)器TCP編程實例7/23/202273char recvBuf100;recv(sockClient,recvBuf,100,0);/ 接收消息printf(%sn,recvBuf);printf(請輸入需要發(fā)送內(nèi)容:n);char sendBug100;scanf(%s,sendBug);send(sockClient,sendBug,strlen(sendBug)+1,0);/發(fā)送消息closesocket(sockClient);/關(guān)閉套接字WSACleanup();/注銷套接字TCP編程實例7/23/202274Overview課程介紹計算機網(wǎng)絡(luò)簡介O

37、SI七層參考模型TCP/IP模型SOCKET介紹基于TCP的SOCKET編程基于UDP的SOCKET編程參考資料 7/23/202275基于UDP的Socket編程服務(wù)器端(接收端)1、創(chuàng)建套接字(socket)。2、將套接字綁定到一個本地地址和端口上(bind)。3、等待接收數(shù)據(jù)(recvfrom)。4、關(guān)閉套接字??蛻舳耍òl(fā)送端)1、創(chuàng)建套接字(socket)。2、向服務(wù)器發(fā)送數(shù)據(jù)(sendto)。3、關(guān)閉套接字。7/23/202276與TCP相同的部分初始化套接字WSAStartup創(chuàng)建套接字socket綁定套接字bind相關(guān)函數(shù)說明7/23/202277接收消息int recvfrom

38、 ( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen ); 參數(shù)說明:s:接收套接字buf:接收消息len:接收消息長度flags:一般設(shè)置為0from:發(fā)送端地址fromlen:地址長度相關(guān)函數(shù)說明7/23/202278返回值:如果沒有錯誤發(fā)生,返回接收到消息的長度;如果連接被關(guān)閉,返回0否則,返回SOCKET_ERROR例:SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);char recvBuf100;SOCKADDR_I

39、N addrClient;int len=sizeof(SOCKADDR);recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);相關(guān)函數(shù)說明7/23/202279發(fā)送消息int sendto ( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen ); 參數(shù)說明:s:發(fā)送套接字buf:發(fā)送消息len:發(fā)送消息長度flags:一般設(shè)置為0to:接收端IP地址tolen:地址長度相關(guān)函數(shù)說明7/23/202280返回值如果沒有錯誤發(fā)生,則返回所發(fā)送的消息長度;否則,返回SOCKET_ERROR例:SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr();addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);sendto(sockClient,Hello,

溫馨提示

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

評論

0/150

提交評論