網絡編程與開發(fā)技術-課件(綜合)_第1頁
網絡編程與開發(fā)技術-課件(綜合)_第2頁
網絡編程與開發(fā)技術-課件(綜合)_第3頁
網絡編程與開發(fā)技術-課件(綜合)_第4頁
網絡編程與開發(fā)技術-課件(綜合)_第5頁
已閱讀5頁,還剩191頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

網絡編程與開發(fā)技術基于NetBIOS的網絡編程動態(tài)鏈接庫多線程編程Winsock編程(網絡編程)Winsock基礎WinsockI/O方法第2章基于NetBIOS的網絡編程2/1/20232-1NetBIOS的基本概念2-2NetBIOS概述2-3NetBIOS命令2-4NetBIOS編程2-1NetBIOS的基本概念NetBIOS是NetworkBasicInput/OutputSystem的簡稱NetBIOS是一個網絡協(xié)議。一般指用于局域網通信的一套API(ApplicationProgrammingInterface)。隨著PC-Network被令牌環(huán)和以太網取代,NetBIOS也應該退出歷史舞臺。但是,由于很多軟件使用了NetBIOS的API,所以NetBIOS被適配到了各種其他的協(xié)議上,比如IPX/SPX和TCP/IP。NetBEUINetBEUI即NetBiosEnhancedUserInterface,或NetBios增強用戶接口。NetBEUI是NetBIOS協(xié)議的增強版本,曾被許多操作系統(tǒng)采用。三種協(xié)議的對比

局域網常用的三種通信協(xié)議分別是TCP/IP協(xié)議、NetBEUI協(xié)議(上世紀80年代早期由IBM開發(fā),用于所謂的PC-Network)和IPX/SPX協(xié)議(Novell開發(fā)的專用于NetWare網絡中的協(xié)議)。2-2NetBIOS概述(1)不管使用哪一種傳輸方式,NetBIOS提供三種不同的服務:名字服務:名字登記和解析會話服務:可靠的基于連接的通信數(shù)據(jù)包服務:不可靠的無連接通信(2)NetBIOS支持面向連接和無連接通信。(2)NetBIOS和NetBEUI被設計為僅僅用于局域網,因此不支持路由。名字管理命令NCBADDNAMENCBADDGRNAMENCBDELNAME數(shù)據(jù)報通訊命令NCBDGSENDNCBDGRECV(NCBDGSENDBC)(NCBDGRECVBC)2-3NetBIOS命令

NCBADDNAMEUCHARAddName(UCHAR*Name,UCHAR*NameNum){ NCBncb;memset(&ncb,0,sizeof(NCB));ncb.ncb_command=NCBADDNAME;ncb.ncb_lala_num=0;strcpy(ncb.ncb_name,Name);Netbios(&ncb);*NameNum=ncb.ncb_num;return(ncb.ncb_cmd_cplt);

}NCBDGSENDUCHARDatagramSend(PNCBpncb,UCHARDestName[],UCHARNum,UCHAR*pBuffer,WORDLength){ memset(pncb,0,sizeof(NCB));pncb->ncb_command=NCBDGSEND;

strcpy(pncb->ncb_callname,DestName);pncb->ncb_num=Num;pncb->ncb_buffer=pBuffer;pncb->ncb_length=Length;Netbios(&ncb);}會話通信命令NCBCALLNCBLISTENNCBSENDNCBRECV和NCBRECVANYNCBHANGUP控制和測試命令NCBRESETNCBCANCEL(NCBUNLINK)NCBSSTATNCBASRAT2-4NetBIOS編程初始化程序 P33加名字與刪除名字 P35數(shù)據(jù)報通信程序 P38會話通信模型 P49*數(shù)據(jù)報通信程序將數(shù)據(jù)發(fā)送到一個特定的唯一名;將數(shù)據(jù)發(fā)送到一個組名;將數(shù)據(jù)廣播到整個網絡;基于NetBIOS的數(shù)據(jù)報通信模型*數(shù)據(jù)報通信程序基于NetBIOS的會話通信模型*會話通信模型*兩種NetBios會話服務器編程模型會話服務器:異步回調模型會話服務器:異步事件模型●異步回調模型程序清單Cbnbsvr.c中,展示了具體的服務器代碼,其中利用的是異步回調函數(shù)。●●異步事件模型事件模型與回調模型相似,唯一的區(qū)別在于對回調模型來說,系統(tǒng)會在異步操作完成后執(zhí)行用戶自定義的代碼;而對事件模型來說,程序必須通過對事件狀態(tài)的檢查,來核實操作是否完成。由于這些屬于標準的Win32事件,所以可在此選用任何同步例程,比如WaitForSingleEvent和WaitForMultipleEvents等等。事件模型顯得更有效率,因為程序員必須為程序規(guī)定一個恰當?shù)慕Y構,有意檢查完成與否。本章小節(jié)本章目的要求:熟悉NetBios網絡編程接口。學會使用NetBios創(chuàng)建C/S結構簡單的網絡通訊程序。(重點)學會使用兩種NetBios服務器編程模型--回調函數(shù)或事件模型。(難點)實驗內容:使用NetBios編程接口編寫一個面向連接的回調模型服務器或者事件模型服務器。要求編寫客戶機測試,客戶機可以和服務器對話??梢允褂每刂婆_字符界面。服務器可以依次和多個用戶對話。第6章動態(tài)鏈接庫2/1/20236-1 動態(tài)鏈接庫的基本概念6-2 動態(tài)鏈接庫的優(yōu)點6-3 動態(tài)鏈接庫的創(chuàng)建和使用6-1 動態(tài)鏈接庫的基本概念動態(tài)鏈接庫(Dynamic-LinkLibrary,簡稱DLL)一些簡單相關概念自從微軟推出16位的Windows操作系統(tǒng)起,此后每種版本的Windows操作系統(tǒng)都非常依賴于動態(tài)鏈接庫(DLL)中的函數(shù)和數(shù)據(jù),實際上Windows操作系統(tǒng)中幾乎所有的內容都由DLL以一種或另外一種形式代表著。顯示的字體和圖標存儲在GDI.DLL中顯示Windows桌面和處理用戶的輸入所需要的代碼被存儲在一個User.DLL中Windows編程所需要的大量的API函數(shù)也被包含在Kernel.DLL中

動態(tài)鏈接庫(DLLs)是從C語言函數(shù)庫和Pascal庫單元的概念發(fā)展而來的。幾乎所有的WindowsAPI都包含在DLL中6-2 DLL的優(yōu)點大工程可分為易管理的小工程與具體的編程語言無關,所以不同程序設計語言之間可以共享DLL實現(xiàn)新功能更容易、軟件升級減少可執(zhí)行代碼大小重用代碼,避免重新開發(fā),提高軟件開發(fā)的效率和質量共享DLL,節(jié)省內存,減少動態(tài)交換6-2 DLL的優(yōu)點DLL可在函數(shù)調用其中的函數(shù)時,才被裝入內存DLL在內存中的一個副本可供多個應用程序使用減少了內存和磁盤空間DLL是包含若干函數(shù)、類或資源的庫文件在動態(tài)庫的情況下,有兩個文件引入庫(.LIB)文件DLL文件引入庫文件包含被DLL導出的函數(shù)的名稱和位置DLL包含實際的函數(shù)和數(shù)據(jù)應用程序使用LIB文件鏈接到所需要使用的DLL文件6-3 動態(tài)鏈接庫的創(chuàng)建和使用微軟的VisualC++支持三種DLLNon-MFC Dll (非MFC動態(tài)鏈接庫)Regular Dll (常規(guī)DLL)Extension Dll (擴展DLL)

6-3-1 非MFC動態(tài)鏈接庫第一步:在VC++中新建一個Win32Dynamic-LinkLibrary工程,本例取名為MyDll。注意不要選擇MFCAppWizard(dll),因為用MFCAppWizard(dll)建立的將是后面要講述的MFC動態(tài)鏈接庫。▲Dll文件的創(chuàng)建例子6-3-1 非MFC動態(tài)鏈接庫刪掉多余部分,留下

BOOLAPIENTRYDllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch(ul_reason_for_call) { caseDLL_PROCESS_ATTACH: caseDLL_THREAD_ATTACH: caseDLL_THREAD_DETACH: caseDLL_PROCESS_DETACH: break; } returnTRUE; }6-3-1 非MFC動態(tài)鏈接庫intadd(intx,inty){returnx+y;}在建立的工程中添加代碼,如下:6-3-1 非MFC動態(tài)鏈接庫第二步:聲明導出函數(shù)。采用模塊定義(.def)文件聲明,.def文件為鏈接器提供了有關被鏈接程序的導出、屬性及其他方面的信息。在dllTest工程中添加MyDll.def文件:/*文件名MyDll.def*/EXPORTS add▲Dll文件的創(chuàng)建例子6-3-1 非MFC動態(tài)鏈接庫6-3-1 非MFC動態(tài)鏈接庫第三步:文件建立完畢后進行編譯,得到dll文件。查看Debug目錄,生成了兩個文件MyDLL.dllMyDLL.lib6-3-1 非MFC動態(tài)鏈接庫建立一個新的應用工程,本例取名為CallDll,它調用MyDLL中的函數(shù)add,其源代碼如下:▲Dll文件的調用例子6-3-1 非MFC動態(tài)鏈接庫#include"stdafx.h"#include<stdio.h>#include<windows.h>typedefint(*lpAddFun)(int,int); //宏定義函數(shù)指針類型intmain(intargc,char*argv[]){ HINSTANCEhDll; //DLL句柄 lpAddFunaddFun; //函數(shù)指針 hDll=LoadLibrary("MyDll.dll");

if(hDll==NULL) { printf("cannotfindtheDLL!\n"); return0;} addFun=(lpAddFun)GetProcAddress(hDll,"add"); if(addFun==NULL) { printf("獲取函數(shù)地址失敗!");return0;}

intresult=addFun(7,3); printf("therusultis%d\n",result); FreeLibrary(hDll); return0;}語句typedefint(*lpAddFun)(int,int)定義了一個與add函數(shù)接受參數(shù)類型和返回值均相同的函數(shù)指針類型。隨后,在main函數(shù)中定義了lpAddFun的實例addFun;其次,在函數(shù)main中定義了一個DLLHINSTANCE句柄實例hDll,通過Win32Api函數(shù)LoadLibrary動態(tài)加載了DLL模塊并將DLL模塊句柄賦給了hDll;再次,在函數(shù)main中通過Win32Api函數(shù)GetProcAddress得到了所加載DLL模塊中函數(shù)add的地址并賦給了addFun。經由函數(shù)指針addFun進行了對DLL中add函數(shù)的調用;最后,應用工程使用完DLL后,在函數(shù)main中通過Win32Api函數(shù)FreeLibrary釋放了已經加載的DLL模塊。6-3-1 非MFC動態(tài)鏈接庫第二步:將前面得到的“.dll”文件,拷貝到本工程所在的路徑,然后再編譯本項目文件,進行調用測試。6-3-1 非MFC動態(tài)鏈接庫這樣,我們完成了非MFC的DLL文件的創(chuàng)建和調用DLL的兩種鏈接方式DLL的顯示鏈接DLL的隱式鏈接6-3-1 非MFC動態(tài)鏈接庫跟顯式鏈接相關的函數(shù)HINSTANCELoadLibrary(LPCTSTRlpLibFileName);

FARPROCGetProcAddress(HMODULEhModule,LPCSTRlpProcName);

BOOLFreeLibrary(HMODULEhLibModule);使用顯式鏈接應用程序編譯時不需要使用相應的Lib文件關鍵字typedef,定義指向和DLL中相同的函數(shù)原型指針DLL的顯式鏈接#include"stdafx.h"#include<stdio.h>#include<windows.h>#include"CallDll2.h"#pragmacomment(lib,"MyDll.lib")_declspec(dllimport)intMyAdd(inta,intb);

intmain(intargc,char*argv[]){ intresult=MyAdd(128,32); printf("therusultis%d\n",result); return0;}DLL的隱式鏈接顯示連接指知道函數(shù)的原型,定義一個函數(shù)指針后,用LoadLibrary和GetProcAddress函數(shù)取函數(shù)的地址的方法。隱式鏈接指已經包含了函數(shù)的.h文件,直接引用函數(shù),在連接的時候將.lib文件連接進去。隱式鏈接后,exe程序一加載,Windows自動在先查找exe文件當前目錄有沒有dll,如果沒有則按搜索路徑查找,如果搜索路徑也沒有則會彈出對話框報錯,提示找不到dll文件。而顯示鏈接在LoadLibrary函數(shù)返回的句柄為NULL,則說明找不到dll,否則就是dll文件加載進內存的句柄。

DLL的顯式鏈接和隱式鏈接的區(qū)別顯式鏈接是應用程序在執(zhí)行過程中隨時可以加載DLL文件,也可以隨時卸載DLL文件,這是隱式鏈接所無法作到的,所以顯式鏈接具有更好的靈活性,對于解釋性語言更為合適。實現(xiàn)顯式鏈接要麻煩一些。DLL的顯式鏈接和隱式鏈接的區(qū)別要先將MyDll.dll和MyDll.lib拷貝到某目錄下面Windows系統(tǒng)將遵循下面的搜索順序來定位DLL:1.包含EXE文件的目錄2.進程的當前工作目錄3.Windows系統(tǒng)目錄4.Windows目錄5.列在Path環(huán)境變量中的一系列目錄

DLL的隱式鏈接中的路徑問題MFC規(guī)則DLL的創(chuàng)建

6-3-2 MFC動態(tài)鏈接庫

1使用MFC向導創(chuàng)建MFC規(guī)則DLL。首先新建一個Project,選擇project的類型為MFCAppWizard(dll)。取生成的.dll文件為MyMFCDll.dll。2新建對話框資源,并關聯(lián)類名為CMainDlg 可以在對話框的Hello按鈕上點擊時加入對話框: MessageBox("Hello,四川師范大學的同學們");3在模版定義文件中(.def)添加如下代碼: EXPORTS;Explicitexportscangohere ShowDlg6-3-2 MFC動態(tài)鏈接庫4在程序的cpp中添加:

#include"MainDlg.h"

voidShowDlg(){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); CMainDlgdllDialog; dllDialog.DoModal();}5編譯成功,生成MyMFCDll.dll文件顯示調用:編寫如圖對話框MFC程序來調用,前面生成的MFC規(guī)則DLL中的對話框。MFC規(guī)則DLL的調用

下面是“顯式調用DLL”按鈕單擊事件的消息處理函數(shù):voidCCallMFCDllDlg::OnButton1(){ typedefvoid(*lpFun)(void); HINSTANCEhDll;//DLL句柄 hDll=LoadLibrary("RegularDll.dll"); if(NULL==hDll) { MessageBox("DLL加載失敗"); return; } lpFunaddFun;//函數(shù)指針 lpFunpShowDlg=(lpFun)GetProcAddress(hDll,"ShowDlg"); if(NULL==pShowDlg) { MessageBox("DLL中函數(shù)尋找失敗"); return; } pShowDlg();}隱式調用MFC規(guī)則DLL: #pragmacomment(lib,"MyMFCDll.lib") voidShowDlg(void); voidCRegularDllCallDlg::OnCalldllButton() { ShowDlg(); }本章小節(jié)DLL的概述DLL的創(chuàng)建DLL的使用掌握DLL的創(chuàng)建方法。熟悉調用DLL的兩種方式。重點:掌握DLL的隱式鏈接難點:DLL的顯示鏈接與DLL的創(chuàng)建。第5章多線程2/1/20235-1 線程的創(chuàng)建5-2 線程同步同步問題資源競爭問題5-1多線程概念程序Program進程Process線程Thread5-1多線程概念線程是一個獨立的執(zhí)行流,是進程內部的一個獨立的執(zhí)行單元,相當于一個子程序。一個進程中的所有線程都在該進程的虛擬地址空間中,共享該進程的全局變量和系統(tǒng)資源。線程是比進程更小的執(zhí)行單元,CPU的調度與時間分配皆以線程為對象。5-1-2線程的創(chuàng)建HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,

//描述這以新線程的安全屬性。NULL表示使用缺省值。

DWORDdwStackSize,//新線程擁有自己的堆棧。0表示使用缺省大小。LPTHREAD_START_ROUTINElpStartAddress,//新線程將開始的起始地址。這是一個函數(shù)指針。所以這里可以放一個函數(shù)名稱。 LPVOIDlpParameter,//將值將被傳送到上述指定的新線程函數(shù)去,作為參數(shù)。DWORDdwCreationFlags,//允許產生一個暫時掛起的線程。默認情況是“立刻開始執(zhí)行”LPDWORDlpThreadId //新線程的ID會被傳回到這里。

);如果CreateThread()成功,傳回一個handle,代表新線程。否則傳回一個FALSE,如果失敗。可以調用GetLastError()獲知原因。5-1-3線程的恢復DWORDResumeThread(

HANDLEhThread

//被激活線程的句柄

);

5-1-4線程的掛起DWORDSuspendThread(

HANDLEhThread

//handletothethread

);5-1-5線程的終止VOIDExitThread(DWORDdwExitCode

//exitcodeforthisthread

);

HANDLEGetCurrentProcess(VOID)

BOOLTerminateThread(HANDLEhThread,

//handletothethread

DWORDdwExitCode

//exitcodeforthethread

);GetExitCodeTread();

DWORD exitCode=0; HANDLE myThread; myThread=CreatThread(NULL,0,ThreadFunc,(LPVOID)1,0, &threadId); for(;;) { GetExitCodeTread(myThread,&exitCode); if(&exitCode!=STILL_ACTIVE) break; }5-2線程同步進程中的所有線程共享進程的虛擬地址空間,這意味著所有線程都可以訪問進程的資源空間。線程共享一方面為編程帶來了方便,但也容易造成訪問沖突。線程同步,是為了協(xié)調多個線程的執(zhí)行,保證數(shù)據(jù)完整性而采取的措施。5-2-1等待函數(shù)等待函數(shù)是一組能使線程阻塞其自身執(zhí)行的函數(shù)。這些函數(shù)只有在一個或多個特定的同步對象產生信號時才會返回。等待函數(shù)即可以保證線程的同步,又可以提高程序的運行效率。WaitForSingleObjectWaitForMultipleObjects5-2-1等待函數(shù)WaitForSingleObjectWaitForSingleObject

DWORD exitCode=0; HANDLE myThread; myThread=CreatThread(NULL,0,ThreadFunc,(LPVOID)1,0, &threadId); for(;;) { GetExitCodeTread(myThread,&exitCode); if(&exitCode!=STILL_ACTIVE) break; }WaitForSingleObject(hThread,0)WaitForSingleObject可被WaitForSingleObject()使用的核心對象有兩種狀態(tài):激發(fā)與未激發(fā).WaitForSingleObject()會在目標物變成激發(fā)狀態(tài)時返回。當核心對象被激發(fā)時,會導致WaitForSingleObject()醒來。當線程結束時,線程對象即被激發(fā);當線程還在進行時候,則對象處于未激發(fā)狀態(tài)。WaitForMultipleObjectsWaitForMultipleObjects允許在同一時間等待一個以上的對象。必須將一個由handles組成的數(shù)組交給此函數(shù),并指定要等待其中一個對象或者使全部的對象。同步控制問題線程同步是通過同步對象而實現(xiàn)。同步對象是一個數(shù)據(jù)結構,用來協(xié)調多線程的執(zhí)行,它可以被多個線程共享。同步對象主要有四種:臨界區(qū)互斥量信號量事件對象5-2-2臨界區(qū)(criticalsection)臨界區(qū)是保證在同一時間只有一個線程可以訪問數(shù)據(jù)的方法。臨界區(qū)對象與互斥量對象相似,但只能被同一進程中的線程使用。5-2-2 (1)創(chuàng)建臨界區(qū)5-2-2 (2)刪除臨界區(qū)例子下面是一個基本例子,用來產生、摧毀一個criticalsection。5-2-2 (3)進入臨界區(qū)一旦criticalsection被初始化,每一個線程就可以進入其中——只要它通過了EnterCriticalSection()這一關。5-2-2 (4)離開臨界區(qū)一個建議:不用長時間鎖住一份資源。如果你一直讓資源被鎖定,你也許會阻止其它線程的執(zhí)行,并把整個程序帶入一個完全停止的狀態(tài)。以CriticalSection來說,當某個線程進入CriticalSeciton時,該資源即被鎖定。5-2-3互斥量互斥量對象主要用于防止同時訪問一個共享資源(一個時間只能夠有一個線程擁有mutex,就好像同一時間只能夠有一個線程進入同一個criticalsection一樣。)互斥量,可以命名的。也就是說,它可以跨越進程使用,所以創(chuàng)建互斥量需要的資源更多?;コ饬颗c臨界區(qū)的比較互斥量與臨界區(qū)的比較5-2-3 (1)創(chuàng)建互斥量例子OpenMutexCloseHandle5-2-3 (2)打開、關閉一個互斥量5-2-4 (3)釋放互斥量的使用權ReleaseMutex如何鎖住一個互斥量5-2-4信號量信號量對象主要通過計數(shù)來限制對共享資源的訪問量。5-2-4(1)創(chuàng)建信號量5-2-4(2)打開、關閉信號量OpenSemaphoreCloseHandle5-2-4(3)釋放信號量如何鎖住一個信號量5-2-5事件對象事件對象主要用于通知其它等待線程某事件已經發(fā)生。5-2-5(1)創(chuàng)建事件對象5-2-5(2)打開、關閉事件對象OpenEventCloseHandle5-2-5(3)設置事件對象SetEvent設置事件為有信號狀態(tài)(激活狀態(tài))ResetEvent設置事件為無信號狀態(tài)(非激活狀態(tài))5-2-6同步機制摘要第3章Winsock編程--Winsock編程基礎2/1/2023本章主要內容SOCKET簡介基于WINDOWSSOCKET的應用開發(fā)介紹WINSOCKAPI主要函數(shù)簡介聊天應用程序的設計說明服務器端客戶端3-1-1 TCP/IP發(fā)展簡介TCP/IP是發(fā)展至今最成功的通信協(xié)議之一。開放目的是允許將分布在各地的裝著完全布同的操作系統(tǒng)的計算機互相通信。80年代初,美國政府的高級研究工程機構(ARPA)給加利福尼亞大學Berkeley分校提供了資金,讓他們在UNIX操作系統(tǒng)下實現(xiàn)TCP/IP協(xié)議。3-1-1 TCP/IP發(fā)展簡介1983年,互聯(lián)網的前身Arpanet中,TCP/IP協(xié)議取代了舊的網絡核心協(xié)議NCP(NetworkCoreProtocol),從而成為今天的互聯(lián)網的基石。3-1-2Socket的發(fā)展研究人員為TCP/IP網絡通信開發(fā)了一個API。這個API稱為Socket接口(套接字)。早期的TCP/IP協(xié)議開發(fā)接口是UNIX操作系統(tǒng)下的Socket。隨著UNIX操作系統(tǒng)的廣泛使用,Socket成為當前最流行的網絡通信應用程序接口之一。Winsock是從UNIX系統(tǒng)的Socket接口演變而來的。3-1-2Socket的發(fā)展90年代初,由Microsoft聯(lián)合了其他幾家公司共同制定了一套WINDOWS下的網絡編程接口,即WindowsSockets規(guī)范。從1991年的1.0版到1995年的2.0.8版,經過不斷完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成為Windows網絡編程的事實上的標準。3-1-2Socket的發(fā)展在實際應用中的WINDOWSSOKCETS規(guī)范主要有1.1版和2.2版。兩者的最重要區(qū)別是1.1版只支持TCP/IP協(xié)議,而2.2版可以支持多協(xié)議。SOCKET實際在計算機中提供了一個通信端口,可以通過這個端口與任何一個具有SOCKET接口的計算機通信。應用程序在網絡上傳輸,接收的信息都通過這個SOCKET接口來實現(xiàn)。在應用開發(fā)中就像使用文件句柄一樣,可以對SOCKET句柄進行讀寫操作。3-1-3Winsock版本 平臺 Winsock版本Windows95 1.1(2.2)Windows98 2.2WindowsNT4.0 2.2Windows2000 2.23-1-4基于WINDOWSSOCKET的應用開發(fā)介紹

在WINDOWS系統(tǒng)中進行WINSOCK開發(fā)使用的編程語言有很多,VC++,JAVA,DELPHI,VB等。VC++用得較多,跟WinSocket聯(lián)系最緊密3-1-5 TCP/IP成功的因素TCP/IP成功的另一個因素在與對為數(shù)眾多的低層協(xié)議的支持。這些低層協(xié)議對應與OSI模型中的第一層(物理層)和第二層(數(shù)據(jù)鏈路層)。每層的所有協(xié)議幾乎都有一半數(shù)量的支持TCP/IP,例如:以太網(Ethernet),令牌環(huán)(TokenRing),光纖數(shù)據(jù)分布接口(FDDI),端對端協(xié)議(PPP),X.25,幀中繼(FrameRelay),ATM,Sonet,SDH等。3-1-5 TCP/IP成功的因素TCP/IP技術的發(fā)展設計目標——實現(xiàn)異種網的網際互連是最早出現(xiàn)的系統(tǒng)化的網絡體系結構之一順應了技術發(fā)展網絡互連的應用需求采用了開放策略與最流行的UNIX操作系統(tǒng)相結合3-2-1 TCP/IP的重要性連接不同系統(tǒng)的技術開放系統(tǒng)。與Internet連接:節(jié)省資金提供強有力的WAN連接:可路由,為廣域網設計的3-2-2計算機網絡的原理體系結構虛通信實通信物理介質

OSI七層結構物理層網絡層數(shù)據(jù)鏈路層會話層傳輸層應用層表示層特點:

概念清晰復雜、不實用3-2-2計算機網絡的原理體系結構報文網際互連層網絡接口層傳輸層應用層網際互連層網絡接口層傳輸層應用層分組數(shù)據(jù)報幀物理網絡TCP/IP層次模型特點:事實上的標準沒有完整的體系結構3-2-3TCP/IP協(xié)議族英文全稱:TransmissionControlProtocol/InternetProtocol中文全稱:傳輸控制協(xié)議/互聯(lián)網協(xié)議TCP/IP實際上是一族協(xié)議,不是單一的協(xié)議。3-2-4TCP/IP協(xié)議族的體系結構TCP/IP是一個四層協(xié)議。鏈路層:也被稱為數(shù)據(jù)鏈路層或網絡接口層。通常包括操作系統(tǒng)中的設備驅動程序、計算機中對應的網絡接口卡,處理與電纜(或其他任何傳輸媒介)的物理接口細節(jié)。該層包括的協(xié)議有:ARP(AddressResolutionProtocol,地址轉換協(xié)議)、RARP(ReverseAddressResolutionProtocol,反向地址轉換協(xié)議)3-2-4TCP/IP協(xié)議族的體系結構網絡層又叫互聯(lián)網層。負責報文分組在網絡中的活動。包括協(xié)議有:IP協(xié)議(網際協(xié)議)ICMP(Internet互聯(lián)網控制報文協(xié)議)IGMP(Internet組管理協(xié)議)3-2-4TCP/IP協(xié)議族的體系結構傳輸層該層主要為兩臺主機上的應用程序提供端到端的數(shù)據(jù)通信。它分為兩個不同的協(xié)議:TCP(TransportControlProtocol,傳輸控制協(xié)議)UDP(UserDatagramProtocol,用戶數(shù)據(jù)報協(xié)議)TCP協(xié)議提供端到端的質量得到保證的數(shù)據(jù)傳輸,該層負責數(shù)據(jù)的分組、質量控制和超時重發(fā)等。UDP協(xié)議只提供簡單的把數(shù)據(jù)報從一端發(fā)送到另一端,至于數(shù)據(jù)是否到達,數(shù)據(jù)是否損壞必須由應用層來做。3-2-4TCP/IP協(xié)議族的體系結構應用層該層負責處理實際的應用程序細節(jié);包括Telnet(遠程登錄)HTTP(WorldWideWeb服務)SMTP(SimpleMailTransferProtocol,簡單郵件傳輸協(xié)議)FTP(FileTransferProtocol,簡單文件傳輸協(xié)議)SNMP(SimpleNetworkManagementProtocol,簡單網絡管理協(xié)議)3-2-4TCP/IP協(xié)議族的體系結構ApplicationPresentationSessionTransportNetworkDatalinkPhysicalTCPUDPIPICMPIGMPARPRARPProtocolsdefinedbytheunderlyingnetworksSMTPFTPTELNETDNSSNMPNFSRPCTFTPApplications3-2-5數(shù)據(jù)如何傳輸3-2-5數(shù)據(jù)如何傳輸通訊實際上是按垂直方向進行的,但在邏輯上通信是在同級進行的3-3 協(xié)議簡介IP層的IP協(xié)議TCP層的TCP、UDP協(xié)議3-3-1IP協(xié)議的功能尋址路由選擇分段與組裝TCP/IP的重要思想之一就是通過各種IP數(shù)據(jù)報和IP地址將它們統(tǒng)一起來,屏蔽低層細節(jié),提供一致性。3-3-1IP地址格式:在Ipv4中,IP地址一般采用點分十進制。如:二進制格式:10000001.00110100.00000110.00000000IP地址的分類TCP/IP分類尋址和IP地址的分類IP地址長度為32bit,包括網絡號(網絡前綴)和主機號不同的地址類型定義了地址中網絡前綴和主機號所占的位數(shù)利用地址類型,可快速區(qū)分出地址中的網絡前綴和主機號組播(Multicast)地址101保留使用101111D類E類主機號網絡前綴241680主機號網絡前綴10主機號網絡前綴10115233101234567C類B類A類路由器和多穴主機的IP地址一類特殊的結點:具有多個物理接口、連接到多個網絡上路由器、多穴主機(multi-homedhost)該結點同時屬于它所連接的多個網絡對應于結點所連接的每一個網絡,給該結點分配一個IP地址結點具有多少網絡連接就擁有多少IP地址可見,IP地址實際上是對結點上網絡連接的標識網絡1/8網絡2/24主機接口A接口B特殊的IP地址直接廣播地址(broadcastaddress)主機號全1的IP地址向指定的網絡進行廣播。有限廣播地址(limitedbroadcastaddress)32位IP地址位全1(即55)表示用于在本網絡中廣播的有限廣播地址。0地址IP地址中主機地址為0的地址表示網絡地址,如:回送地址(loopbackaddress)網絡號為127的A類地址(如)用于本地軟件測試(測試應用層與網絡軟件之間的進程間通信)IP地址是進行選路依據(jù)選路(Routing)的概念根據(jù)分組目的地址,尋找一條能將分組從信源主機轉發(fā)到目的主機的通路的過程。選路是依據(jù)IP地址進行的選路使用的數(shù)據(jù)結構是路由表(轉發(fā)信息庫-FIB)IP協(xié)議每發(fā)送(轉發(fā))一個分組,都要利用路由表來選路。路由表的概念結構目的地址D1去往D1的路徑目的地址D2去往D2的路徑目的地址D3去往D3的路徑目的網絡N1去N1的路徑(next-hop)目的網絡N2去N2的路徑(next-hop)目的網絡N3去N3的路徑(next-hop)TCP/IP的地址解析IP地址到物理地址的映射TCP/IP的地址解析地址解析的含義實現(xiàn)IP地址與網絡物理地址的映射實現(xiàn)地址解析的意義Internet是由多個網絡互連構成的“虛擬”網絡,采用統(tǒng)一的IP地址進行結點間(網絡間)的相互通信IP地址統(tǒng)一了網際通信的地址形式(IP層以上的軟件都使用IP地址),隱藏了原有的物理網絡地址但在網絡內部,IP層通信的實現(xiàn)依賴于底層的物理網絡技術,底層必然還要使用物理地址為了保證通信的一致性,必須要建立各結點IP地址與網絡物理地址之間的映射,稱為地址解析(resolution)。TCP/IP的地址解析地址解析的兩個方向根據(jù)IP地址獲得物理地址根據(jù)物理地址獲得IP地址的相應地,TCP/IP中定義了兩個解析協(xié)議:地址解析協(xié)議(ARP–AddressResolutionProtocol)用于IP地址到物理地址的映射逆向地址解析協(xié)議(RARP–ReverseAddressResolutionProtocol)用于物理地址到IP地址的映射地址解析在協(xié)議棧中的位置地址解析是在物理地址上加的一層地址機制,通常被看作是IP層以下的功能,可認為是物理網絡的一部分。地址解析(IP地址->物理地址)固定表格法事先在各主機中建立IP地址與物理地址的轉換表。直接映射法物理地址是可配置的,物理地址可以直接作為IP地址的一部分(例如作為主機號),進行地址解析時直接可從IP地址得到其物理地址。動態(tài)綁定法(Dynamicbinding)對于以太網等具有廣播功能的網絡技術,TCP/IP設計了一種動態(tài)綁定的地址解析技術,并制定的標準的協(xié)議,即ARP協(xié)議。從理論上計算全部32位都用上可以允許有232超過四十億的地址!這幾乎可以為地球三分之二的人提供一個地址。但事實上,隨著Internet的發(fā)展,可用的IP地址已經快要用完了。在將來的Ipv6中,IP地址由十六個八位域組成,共128位二進制形式的IP地址組成,還是用點號每八位一分割,在現(xiàn)在看來是足夠了,但不知道還會有什么意想不到的事情令IP地址又不夠用了。IP數(shù)據(jù)報格式3-4TCP協(xié)議的功能保證傳輸?shù)目煽啃?/p>

提供部分應用層信息的功能

TCP段格式20~60bytes3-6WINSOCKAPI主要函數(shù)簡介WSAStartupWSACleanupsocketclosesocketbindlistenacceptconnectrecv recvfromsendsendtoWinsock初始化函數(shù)3-6WINSOCKAPI主要函數(shù)簡介WSAStartup()連結應用程序與WindowsSocketsDLL的第一個函數(shù)此函數(shù)是應用程序調用WindowsSocketsDLL函數(shù)中的第一個,此函數(shù)調用成功后,才可以再調用其他WindowsSocketsDLL的函數(shù)。intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);

wVersionRequested是WinSocketAPI提供的調用方可使用的最高版本號,高字節(jié)是副版本號,低字節(jié)是主版本號lpWSAData是指向WSADATA的指針,用來接收Socket的實現(xiàn)細節(jié)….//初始化套接字WSADATA WSAData;WSAStartup(MAKEWORD(2,2),&WSAData)…補充-MAKEWORD函數(shù)宏MAKEWORD,將高八位和低八位組合成一個word。inlinewordMAKEWORD(constbytewHigh,constbytewLow)

{

return((word)wHigh)<<8|wLow;

}BYTE

hb

在內存里面

11

BYTE

lb

在內存里面

22WORD

dw

=

MAKEWORD(hb,

lb);

在內存里面為:

11

22

因此MAKEWORD(2,1)實際等同于0x0201。同樣地,0x0101可等同于MAKEWORD(1,1)。WSACleanup()結束WindowsSocketsDLL的使用當應用程序不再需要使用WindowsSocketsDLL時,須調用此函數(shù)來注銷使用,以便釋放其占用的資源。intWSACleanup();基本Winsock函數(shù)3-6WINSOCKAPI主要函數(shù)簡介socket()SOCKETsocket(intaf,inttype,intprotocol);

af一般取為AF_INET,表示互聯(lián)網協(xié)議組type,套接字的類型SOCK_STREAM(會話套接字)SOCK_DGRAM(數(shù)據(jù)包套接字)SOCK_RAW(原始套接字)SOCK_SEQPACKET(順序數(shù)據(jù)包

)SOCK_RDM(提供可信賴的數(shù)據(jù)包連接

)protocol,套接字所使用的協(xié)議一般取0,表示默認為TCP/IP協(xié)議bind()intbind(SOCKETs,conststructsockaddr*name,intnamelen);

一旦為某種特定協(xié)議創(chuàng)建了套接字,就必須將套接字綁定到一個已知地址。bind函數(shù)可將指定的套接字同一個已知地址綁定到一起。s:標識一未綁定套接字的句柄。name:指向與協(xié)議有關的地址結構的指針。該結構稱為套接字地址結構。該結構的類型是Slen:代表name指向的地址結構的長度。structsockaddr{u_short sa_family;char sa_data[14];};structsockaddr_in{short sin_family;u_short sin_port;struct in_addr sin_addr;char sin_zero[8];};sin_family字段必須設為AF_INET,表示該socket處于Internet域。sin_port字段用于指定服務器端口。sin_addr字段用于把一個IP地址保存為一個4字節(jié)的數(shù)函數(shù)inet_addr可以把點分式IP地址轉換為一個32位無符合長整數(shù)。sin_zero只當填充項的作用。下面看一個例子在TCP連接上進行套接字綁定示例listen()intlisten(SOCKETs,intbacklog);

s:標識一個已經綁定但未連接套接字的句柄。backlog:表示等待連接隊列的最大長度。功能:將套接字設置為偵聽模式,等待客戶端提出的連接申請。accept()SOCKETaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);

功能:在指定的套接字上接受一個連接。服務器接收客戶的連接請求,在建立好輸入隊列以后,服務器就調用accept,然后進入休眠狀態(tài),等待用戶的連接請求S:套接字句柄,該套接字在listen()后已經偵聽連接addr:連接請求方SOCKADDR_IN結構的地址。addrlen:SOCKADDR_IN結構長度。accept()的調用過程示例SOCKETsServSock;sockaddr_inaddr;intnSockErr;intnNumConns[5];sockaddrConnaddrs[5];intnAddrLen=sizeof(sockaddr);//建立socket對象sServSock=socket(AF_INET,SOCK_STREAM,0);//為socket分配端口addr.sin_family=AF_INET;addr.sin_port=htons(5050);addr.sin_addr.s_s_addr=htonl(INADDR_ANY);if(bind(sServSock,(LPSOCKADDR)&addr,sizeof(addr))==SOCKET_ERROR){ nSockErr=WSAGetLastError();}//偵聽客戶連接的請求if(listen(sServSock,2)==SOCKET_ERROR){ nSockErr=WSAGetLastError(); //處理錯誤,不再繼續(xù)}while(nNumconns<5){ //接受連接 sConns[nNumConns]=accept(sServSock,ConnAddrs[nNumConns],&nAddrLen);if(sConns[nNumConns]==INVALID_SOCKET) { nSockErr=WSAGetLastError(); } else { StartNewHandleThread(sConns[nNumConns]); nNumConns++; }}connect()intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);

用于建立與一個服務器端的連接。當連接建立完成后,客戶端即可利用此Socket來與服務端進行信息傳遞。closesocket()intclosesocket(SOCKETs);

shutdown()intclosesocket(SOCKETs,inthow);

Winsock中數(shù)據(jù)傳輸函數(shù)3-6WINSOCKAPI主要函數(shù)簡介sendintsend(SOCKETs,constcharFAR*buf,intlen,intflags);功能:向一個已連接的套接字發(fā)送數(shù)據(jù)sendsendtointsend(SOCKETs,constcharFAR*buf,intlen,intflags);功能:向一個已連接的套接字發(fā)送數(shù)據(jù)intsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen);

功能:向一指定目的地發(fā)送數(shù)據(jù)recv recvfromintrecv(SOCKETs,charFAR*buf,intlen,intflags);

功能:從已建立連接的套接字接收數(shù)據(jù)。intrecvfrom(SOCKETs,charFAR*buf,intlen,intflags,structsockaddrFAR*from,intFAR*fromlen);

功能:接收一個數(shù)據(jù)報并保存發(fā)送方地址結構信息。字節(jié)順序及地址轉換函數(shù)3-6WINSOCKAPI主要函數(shù)簡介(1)字節(jié)順序轉換函數(shù)功能:把一個數(shù)從主機字節(jié)順序轉換為網絡字節(jié)順序。u_long htonl (u_longhostlong);int WSAHtonl (SOCKETs,u_longhostlong,u_longFAR*lpnetlong);u_short htons (u_shorthostshort);int WSAHtons (SOCKETs,u_shorthostshort,u_shortFAR*lpnetshort);(1)字節(jié)順序轉換函數(shù)功能:把網絡字節(jié)順序轉換為主機字節(jié)順序。u_long ntoh(u_longnetlong);int WSANtohl(SOCKETs,u_longnetlong,u_longFAR*lphostlong);u_short ntohs (u_shortnetshort);int WSANtohs (SOCKETs,u_shortnetlong,u_shortFAR*lphostlong);(2)地址轉換函數(shù)功能:把網絡字節(jié)順序轉換為主機字節(jié)順序。unsignedlonginet_addr(constcharFAR*cp);將點分式IP地址轉換為一個32位的無符號長整數(shù)。cp是一個以Internet標準“.”間隔的IP地址字符串。這個函數(shù)的返回是一個網絡字節(jié)順序的32位長整數(shù)。char*inet_ntoa(structint_addrinaddr);inet_ntoa()將32位無符號長整型轉換為點分式IP地址。網絡信息查詢函數(shù)3-6WINSOCKAPI主要函數(shù)簡介(1)getpeername功能:獲取通信對方的套接字地址結構信息。

intPASCALFARgetpeername(SOCKETs,structsockaddrFAR*name,intFAR*namelen);s:已連接的套接字。name:通信對方的套接字地址結構。namelen:一個指向地址結構長度的指針。(2)getsockname功能:該函數(shù)是getpeer的對應函數(shù)。獲取指定套接字的本地地址結構信息。

intPASCALFARgetsockname(SOCKETs,structsockaddrFAR*name,

intFAR*namelen);s:標識一個已綁定套接字的句柄。name:套接字的地址結構。namelen:一個指向地址結構長度的指針。(3)gethostbyname功能:返回對應于給定主機名的主機信息。在已知主機名而打算查找其IP地址的時候,可以使用這個函數(shù)。

structhostentFARgethostbyname(c

溫馨提示

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

評論

0/150

提交評論