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

下載本文檔

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

文檔簡介

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

局域網(wǎng)常用的三種通信協(xié)議分別是TCP/IP協(xié)議、NetBEUI協(xié)議(上世紀(jì)80年代早期由IBM開發(fā),用于所謂的PC-Network)和IPX/SPX協(xié)議(Novell開發(fā)的專用于NetWare網(wǎng)絡(luò)中的協(xié)議)。2-2NetBIOS概述(1)不管使用哪一種傳輸方式,NetBIOS提供三種不同的服務(wù):名字服務(wù):名字登記和解析會(huì)話服務(wù):可靠的基于連接的通信數(shù)據(jù)包服務(wù):不可靠的無連接通信(2)NetBIOS支持面向連接和無連接通信。(2)NetBIOS和NetBEUI被設(shè)計(jì)為僅僅用于局域網(wǎng),因此不支持路由。名字管理命令NCBADDNAMENCBADDGRNAMENCBDELNAME數(shù)據(jù)報(bào)通訊命令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);}會(huì)話通信命令NCBCALLNCBLISTENNCBSENDNCBRECV和NCBRECVANYNCBHANGUP控制和測(cè)試命令NCBRESETNCBCANCEL(NCBUNLINK)NCBSSTATNCBASRAT2-4NetBIOS編程初始化程序 P33加名字與刪除名字 P35數(shù)據(jù)報(bào)通信程序 P38會(huì)話通信模型 P49*數(shù)據(jù)報(bào)通信程序?qū)?shù)據(jù)發(fā)送到一個(gè)特定的唯一名;將數(shù)據(jù)發(fā)送到一個(gè)組名;將數(shù)據(jù)廣播到整個(gè)網(wǎng)絡(luò);基于NetBIOS的數(shù)據(jù)報(bào)通信模型*數(shù)據(jù)報(bào)通信程序基于NetBIOS的會(huì)話通信模型*會(huì)話通信模型*兩種NetBios會(huì)話服務(wù)器編程模型會(huì)話服務(wù)器:異步回調(diào)模型會(huì)話服務(wù)器:異步事件模型●異步回調(diào)模型程序清單Cbnbsvr.c中,展示了具體的服務(wù)器代碼,其中利用的是異步回調(diào)函數(shù)?!瘛癞惒绞录P褪录P团c回調(diào)模型相似,唯一的區(qū)別在于對(duì)回調(diào)模型來說,系統(tǒng)會(huì)在異步操作完成后執(zhí)行用戶自定義的代碼;而對(duì)事件模型來說,程序必須通過對(duì)事件狀態(tài)的檢查,來核實(shí)操作是否完成。由于這些屬于標(biāo)準(zhǔn)的Win32事件,所以可在此選用任何同步例程,比如WaitForSingleEvent和WaitForMultipleEvents等等。事件模型顯得更有效率,因?yàn)槌绦騿T必須為程序規(guī)定一個(gè)恰當(dāng)?shù)慕Y(jié)構(gòu),有意檢查完成與否。本章小節(jié)本章目的要求:熟悉NetBios網(wǎng)絡(luò)編程接口。學(xué)會(huì)使用NetBios創(chuàng)建C/S結(jié)構(gòu)簡單的網(wǎng)絡(luò)通訊程序。(重點(diǎn))學(xué)會(huì)使用兩種NetBios服務(wù)器編程模型--回調(diào)函數(shù)或事件模型。(難點(diǎn))實(shí)驗(yàn)內(nèi)容:使用NetBios編程接口編寫一個(gè)面向連接的回調(diào)模型服務(wù)器或者事件模型服務(wù)器。要求編寫客戶機(jī)測(cè)試,客戶機(jī)可以和服務(wù)器對(duì)話??梢允褂每刂婆_(tái)字符界面。服務(wù)器可以依次和多個(gè)用戶對(duì)話。第6章動(dòng)態(tài)鏈接庫2/1/20236-1 動(dòng)態(tài)鏈接庫的基本概念6-2 動(dòng)態(tài)鏈接庫的優(yōu)點(diǎn)6-3 動(dòng)態(tài)鏈接庫的創(chuàng)建和使用6-1 動(dòng)態(tài)鏈接庫的基本概念動(dòng)態(tài)鏈接庫(Dynamic-LinkLibrary,簡稱DLL)一些簡單相關(guān)概念自從微軟推出16位的Windows操作系統(tǒng)起,此后每種版本的Windows操作系統(tǒng)都非常依賴于動(dòng)態(tài)鏈接庫(DLL)中的函數(shù)和數(shù)據(jù),實(shí)際上Windows操作系統(tǒng)中幾乎所有的內(nèi)容都由DLL以一種或另外一種形式代表著。顯示的字體和圖標(biāo)存儲(chǔ)在GDI.DLL中顯示W(wǎng)indows桌面和處理用戶的輸入所需要的代碼被存儲(chǔ)在一個(gè)User.DLL中Windows編程所需要的大量的API函數(shù)也被包含在Kernel.DLL中

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

6-3-1 非MFC動(dòng)態(tài)鏈接庫第一步:在VC++中新建一個(gè)Win32Dynamic-LinkLibrary工程,本例取名為MyDll。注意不要選擇MFCAppWizard(dll),因?yàn)橛肕FCAppWizard(dll)建立的將是后面要講述的MFC動(dòng)態(tài)鏈接庫?!鳧ll文件的創(chuàng)建例子6-3-1 非MFC動(dòng)態(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動(dòng)態(tài)鏈接庫intadd(intx,inty){returnx+y;}在建立的工程中添加代碼,如下:6-3-1 非MFC動(dòng)態(tài)鏈接庫第二步:聲明導(dǎo)出函數(shù)。采用模塊定義(.def)文件聲明,.def文件為鏈接器提供了有關(guān)被鏈接程序的導(dǎo)出、屬性及其他方面的信息。在dllTest工程中添加MyDll.def文件:/*文件名MyDll.def*/EXPORTS add▲Dll文件的創(chuàng)建例子6-3-1 非MFC動(dòng)態(tài)鏈接庫6-3-1 非MFC動(dòng)態(tài)鏈接庫第三步:文件建立完畢后進(jìn)行編譯,得到dll文件。查看Debug目錄,生成了兩個(gè)文件MyDLL.dllMyDLL.lib6-3-1 非MFC動(dòng)態(tài)鏈接庫建立一個(gè)新的應(yīng)用工程,本例取名為CallDll,它調(diào)用MyDLL中的函數(shù)add,其源代碼如下:▲Dll文件的調(diào)用例子6-3-1 非MFC動(dòng)態(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)定義了一個(gè)與add函數(shù)接受參數(shù)類型和返回值均相同的函數(shù)指針類型。隨后,在main函數(shù)中定義了lpAddFun的實(shí)例addFun;其次,在函數(shù)main中定義了一個(gè)DLLHINSTANCE句柄實(shí)例hDll,通過Win32Api函數(shù)LoadLibrary動(dòng)態(tài)加載了DLL模塊并將DLL模塊句柄賦給了hDll;再次,在函數(shù)main中通過Win32Api函數(shù)GetProcAddress得到了所加載DLL模塊中函數(shù)add的地址并賦給了addFun。經(jīng)由函數(shù)指針addFun進(jìn)行了對(duì)DLL中add函數(shù)的調(diào)用;最后,應(yīng)用工程使用完DLL后,在函數(shù)main中通過Win32Api函數(shù)FreeLibrary釋放了已經(jīng)加載的DLL模塊。6-3-1 非MFC動(dòng)態(tài)鏈接庫第二步:將前面得到的“.dll”文件,拷貝到本工程所在的路徑,然后再編譯本項(xiàng)目文件,進(jìn)行調(diào)用測(cè)試。6-3-1 非MFC動(dòng)態(tài)鏈接庫這樣,我們完成了非MFC的DLL文件的創(chuàng)建和調(diào)用DLL的兩種鏈接方式DLL的顯示鏈接DLL的隱式鏈接6-3-1 非MFC動(dòng)態(tài)鏈接庫跟顯式鏈接相關(guān)的函數(shù)HINSTANCELoadLibrary(LPCTSTRlpLibFileName);

FARPROCGetProcAddress(HMODULEhModule,LPCSTRlpProcName);

BOOLFreeLibrary(HMODULEhLibModule);使用顯式鏈接應(yīng)用程序編譯時(shí)不需要使用相應(yīng)的Lib文件關(guān)鍵字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ù)的原型,定義一個(gè)函數(shù)指針后,用LoadLibrary和GetProcAddress函數(shù)取函數(shù)的地址的方法。隱式鏈接指已經(jīng)包含了函數(shù)的.h文件,直接引用函數(shù),在連接的時(shí)候?qū)?lib文件連接進(jìn)去。隱式鏈接后,exe程序一加載,Windows自動(dòng)在先查找exe文件當(dāng)前目錄有沒有dll,如果沒有則按搜索路徑查找,如果搜索路徑也沒有則會(huì)彈出對(duì)話框報(bào)錯(cuò),提示找不到dll文件。而顯示鏈接在LoadLibrary函數(shù)返回的句柄為NULL,則說明找不到dll,否則就是dll文件加載進(jìn)內(nèi)存的句柄。

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

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

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

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

#include"MainDlg.h"

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

下面是“顯式調(diào)用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();}隱式調(diào)用MFC規(guī)則DLL: #pragmacomment(lib,"MyMFCDll.lib") voidShowDlg(void); voidCRegularDllCallDlg::OnCalldllButton() { ShowDlg(); }本章小節(jié)DLL的概述DLL的創(chuàng)建DLL的使用掌握DLL的創(chuàng)建方法。熟悉調(diào)用DLL的兩種方式。重點(diǎn):掌握DLL的隱式鏈接難點(diǎn):DLL的顯示鏈接與DLL的創(chuàng)建。第5章多線程2/1/20235-1 線程的創(chuàng)建5-2 線程同步同步問題資源競(jìng)爭問題5-1多線程概念程序Program進(jìn)程Process線程Thread5-1多線程概念線程是一個(gè)獨(dú)立的執(zhí)行流,是進(jìn)程內(nèi)部的一個(gè)獨(dú)立的執(zhí)行單元,相當(dāng)于一個(gè)子程序。一個(gè)進(jìn)程中的所有線程都在該進(jìn)程的虛擬地址空間中,共享該進(jìn)程的全局變量和系統(tǒng)資源。線程是比進(jìn)程更小的執(zhí)行單元,CPU的調(diào)度與時(shí)間分配皆以線程為對(duì)象。5-1-2線程的創(chuàng)建HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,

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

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

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

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

OSI七層結(jié)構(gòu)物理層網(wǎng)絡(luò)層數(shù)據(jù)鏈路層會(huì)話層傳輸層應(yīng)用層表示層特點(diǎn):

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

提供部分應(yīng)用層信息的功能

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

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

{

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

}BYTE

hb

在內(nèi)存里面

11

BYTE

lb

在內(nèi)存里面

22WORD

dw

=

MAKEWORD(hb,

lb);

在內(nèi)存里面為:

11

22

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

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

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

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

一旦為某種特定協(xié)議創(chuàng)建了套接字,就必須將套接字綁定到一個(gè)已知地址。bind函數(shù)可將指定的套接字同一個(gè)已知地址綁定到一起。s:標(biāo)識(shí)一未綁定套接字的句柄。name:指向與協(xié)議有關(guān)的地址結(jié)構(gòu)的指針。該結(jié)構(gòu)稱為套接字地址結(jié)構(gòu)。該結(jié)構(gòu)的類型是Slen:代表name指向的地址結(jié)構(gòu)的長度。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字段必須設(shè)為AF_INET,表示該socket處于Internet域。sin_port字段用于指定服務(wù)器端口。sin_addr字段用于把一個(gè)IP地址保存為一個(gè)4字節(jié)的數(shù)函數(shù)inet_addr可以把點(diǎn)分式IP地址轉(zhuǎn)換為一個(gè)32位無符合長整數(shù)。sin_zero只當(dāng)填充項(xiàng)的作用。下面看一個(gè)例子在TCP連接上進(jìn)行套接字綁定示例listen()intlisten(SOCKETs,intbacklog);

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

功能:在指定的套接字上接受一個(gè)連接。服務(wù)器接收客戶的連接請(qǐng)求,在建立好輸入隊(duì)列以后,服務(wù)器就調(diào)用accept,然后進(jìn)入休眠狀態(tài),等待用戶的連接請(qǐng)求S:套接字句柄,該套接字在listen()后已經(jīng)偵聽連接addr:連接請(qǐng)求方SOCKADDR_IN結(jié)構(gòu)的地址。addrlen:SOCKADDR_IN結(jié)構(gòu)長度。accept()的調(diào)用過程示例SOCKETsServSock;sockaddr_inaddr;intnSockErr;intnNumConns[5];sockaddrConnaddrs[5];intnAddrLen=sizeof(sockaddr);//建立socket對(duì)象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();}//偵聽客戶連接的請(qǐng)求if(listen(sServSock,2)==SOCKET_ERROR){ nSockErr=WSAGetLastError(); //處理錯(cuò)誤,不再繼續(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);

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

shutdown()intclosesocket(SOCKETs,inthow);

Winsock中數(shù)據(jù)傳輸函數(shù)3-6WINSOCKAPI主要函數(shù)簡介sendintsend(SOCKETs,constcharFAR*buf,intlen,intflags);功能:向一個(gè)已連接的套接字發(fā)送數(shù)據(jù)sendsendtointsend(SOCKETs,constcharFAR*buf,intlen,intflags);功能:向一個(gè)已連接的套接字發(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);

功能:接收一個(gè)數(shù)據(jù)報(bào)并保存發(fā)送方地址結(jié)構(gòu)信息。字節(jié)順序及地址轉(zhuǎn)換函數(shù)3-6WINSOCKAPI主要函數(shù)簡介(1)字節(jié)順序轉(zhuǎn)換函數(shù)功能:把一個(gè)數(shù)從主機(jī)字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(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é)順序轉(zhuǎn)換函數(shù)功能:把網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換為主機(jī)字節(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)地址轉(zhuǎn)換函數(shù)功能:把網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換為主機(jī)字節(jié)順序。unsignedlonginet_addr(constcharFAR*cp);將點(diǎn)分式IP地址轉(zhuǎn)換為一個(gè)32位的無符號(hào)長整數(shù)。cp是一個(gè)以Internet標(biāo)準(zhǔn)“.”間隔的IP地址字符串。這個(gè)函數(shù)的返回是一個(gè)網(wǎng)絡(luò)字節(jié)順序的32位長整數(shù)。char*inet_ntoa(structint_addrinaddr);inet_ntoa()將32位無符號(hào)長整型轉(zhuǎn)換為點(diǎn)分式IP地址。網(wǎng)絡(luò)信息查詢函數(shù)3-6WINSOCKAPI主要函數(shù)簡介(1)getpeername功能:獲取通信對(duì)方的套接字地址結(jié)構(gòu)信息。

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

intPASCALFARgetsockname(SOCKETs,structsockaddrFAR*name,

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

structhostentFARgethostbyname(c

溫馨提示

  • 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)論