




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、如有你有幫助,請(qǐng)購買下載,謝謝!網(wǎng)絡(luò)和黑客編程基本知識(shí)2009-10-28 10:17:14來源:冰點(diǎn)極限& 海洋頂端第一節(jié)了解 Windows 機(jī)制Windows是一個(gè) “基于事件的,消息驅(qū)動(dòng)的”操作系統(tǒng)。在 Windows 下執(zhí)行一個(gè)程序,只要用戶進(jìn)行了影響窗口的動(dòng)作(如改變窗口大小或移動(dòng)、單擊鼠標(biāo)等)該動(dòng)作就會(huì)觸發(fā)一個(gè)相應(yīng) .第一節(jié)了解 Windows機(jī)制Windows是一個(gè) “基于事件的,消息驅(qū)動(dòng)的”操作系統(tǒng)。在 Windows下執(zhí)行一個(gè)程序,只要用戶進(jìn)行了影響窗口的動(dòng)作(如改變窗口大小或移動(dòng)、單擊鼠標(biāo)等)該動(dòng)作就會(huì)觸發(fā)一個(gè)相應(yīng)的“事件 ”系統(tǒng)每次檢測(cè)到一個(gè)事件時(shí),就會(huì)給程序發(fā)送一個(gè)“
2、消息 ”,從而使程序可以處理該事件。每個(gè) Windows 應(yīng)用程序都是基于事件和消息的, 而且包含一個(gè)主事件循環(huán), 它不停地、反復(fù)地檢測(cè)是否有用戶事件發(fā)生。每次檢測(cè)到一個(gè)用戶事件,程序就對(duì)該事件做出響應(yīng),處理完再等待下一個(gè)事件的發(fā)生。Windows下的應(yīng)用程序不斷地重復(fù)這一過程,直至用戶終止程序,用代碼來描述實(shí)際上也就是一個(gè)消息處理過程的while 循環(huán)語句。下面便簡(jiǎn)單介紹一下與Windows系統(tǒng)密切相關(guān)的幾個(gè)基本概念:1:窗口:這是我要說的第一個(gè)概念。窗口是Windows本身以及 Windows環(huán)境下的應(yīng)用程序的基本界面單位,但是很多人都誤以為只有具有標(biāo)題欄、狀態(tài)欄、最大化、最小化按鈕這樣標(biāo)
3、準(zhǔn)的方框才叫窗口。其實(shí)窗口的概念很廣,例如按鈕和對(duì)話框等也是窗口,只不過是一種特殊化窗口罷了。從用戶的角度看,窗口就是顯示在屏幕上的一個(gè)矩形區(qū)域,其外觀獨(dú)立于應(yīng)用程序,事實(shí)上它就是生成該窗口的應(yīng)用程序與用戶間的直觀接口; 從應(yīng)用程序的角度看,窗口是受其控制的一部分矩形屏幕區(qū)。應(yīng)用程序生成并控制與窗口有關(guān)的一切內(nèi)容,包括窗口的大小、風(fēng)格、位置以及窗口內(nèi)顯示的內(nèi)容等。用戶打開一個(gè)應(yīng)用程序后,程序?qū)?chuàng)建一個(gè)窗口,并在那里默頁如有你有幫助,請(qǐng)購買下載,謝謝!默地等待用戶的要求。每當(dāng)用戶選擇窗口中的選項(xiàng),程序即對(duì)此做出響應(yīng)。2:程序:通常說的程序都是指一個(gè)能讓計(jì)算機(jī)識(shí)別的文件,接觸得最多的便是.exe
4、型的可執(zhí)行文件 .3:進(jìn)程:說到進(jìn)程,學(xué)過操作系統(tǒng)的人都很清楚,所謂進(jìn)程就是應(yīng)用程序的執(zhí)行實(shí)例(或稱一個(gè)執(zhí)行程序)需要注意的是:進(jìn)程是程序動(dòng)態(tài)的描述,而上面說到的程序是靜態(tài)的描述,兩者有本質(zhì)的區(qū)別。舉個(gè)例子,從網(wǎng)上Down 了一個(gè)瑞星殺毒軟件到C 盤但沒有運(yùn)行,那個(gè).exe可執(zhí)行文件叫做程序,它是一個(gè)二進(jìn)制碼的文件。一旦雙擊了exe 文件圖標(biāo)運(yùn)行程序,那個(gè) “正在運(yùn)行著的瑞星殺毒”便稱為進(jìn)程,它在雙擊的那一刻被系統(tǒng)創(chuàng)建,當(dāng)你關(guān)機(jī)或者在任務(wù)欄的圖標(biāo)上單擊鼠標(biāo)右鍵選“退出 ”時(shí),進(jìn)程便消亡,徹底結(jié)束了生命。進(jìn)程經(jīng)歷了由“創(chuàng)建”到“消亡 ”的生命期,而程序自始至終存在于你的硬盤上,不管你的機(jī)器是否啟
5、動(dòng)。4:線程:線程是進(jìn)程中的一個(gè)執(zhí)行單元,同一個(gè)進(jìn)程中的各個(gè)線程對(duì)應(yīng)于一組CPU 指令、一組 CPU 寄存器以及一堆棧。進(jìn)程本來就具有動(dòng)態(tài)的含義,然而實(shí)質(zhì)上是通過線程來執(zhí)行體現(xiàn)的,從這個(gè)意義上說,Windows中進(jìn)程的動(dòng)態(tài)性意義已經(jīng)不是很明顯了,只算是給程序所占的資源劃定一個(gè)范圍而已,真正具有動(dòng)態(tài)性意義的是線程。5:消息:我們幾乎做每一個(gè)動(dòng)作都會(huì)產(chǎn)生一個(gè)消息,鼠標(biāo)被移動(dòng)會(huì)產(chǎn)生WM_MOUSEMOVE 消息,鼠標(biāo)左鍵被按下會(huì)產(chǎn)生 WM_LBUTTONDOWN 的消息,鼠標(biāo)右鍵按下便產(chǎn)生 WM_RBUTTONDOWN 消息等等。所有的這些都可以通過GetMessage , SendMessage等
6、函數(shù)得到 .6:事件 :如在程序運(yùn)行的過程中改變窗口的大小或者移動(dòng)窗口等,都會(huì)觸發(fā)相應(yīng)的“事件 ”。7:句柄:?jiǎn)螁我粋€(gè)“柄 ”字便可以解釋它的意思了,我們天氣熱搖扇子的時(shí)候只要抓住扇柄便可以控制整個(gè)扇子的運(yùn)動(dòng)了,在程序中也差不多是這個(gè)意思。通常一個(gè)句柄就可以傳遞我們所要做的事情。有經(jīng)驗(yàn)的成員肯定清楚,編寫程序總是要和各種句柄打交道的,句柄是系統(tǒng)用來標(biāo)識(shí)不同對(duì)象類型的工具, 如窗口、 菜單等, 這些東西在系統(tǒng)中被視為不同類型的對(duì)象,用不同的句柄將他們區(qū)分開來。C+教材中給句柄下的定義是:“在 Win32 里,句柄是指向一個(gè)無值型對(duì)象(void * )的指針,是一個(gè)4 字節(jié)長(zhǎng)的數(shù)據(jù) ”。從結(jié)構(gòu)頁如
7、有你有幫助,請(qǐng)購買下載,謝謝!上看, 句柄的確是一個(gè)指針,盡管它沒有指向用于存儲(chǔ)某個(gè)對(duì)象的內(nèi)存位置,而實(shí)際上句柄指向的是一個(gè)包含了對(duì)該對(duì)象進(jìn)行的引用的位置。在編程時(shí),只要抓住了對(duì)象的句柄就可以對(duì)該對(duì)象進(jìn)行操作了.8:API 與 SDK :API 是英文Application Programming Interface的簡(jiǎn)稱,意為“應(yīng)用程序接口 ”,泛指系統(tǒng)為應(yīng)用程序提供的一系列接口函數(shù)。 其實(shí)質(zhì)是程序內(nèi)的一套函數(shù)調(diào)用,在編程的時(shí)候可以直接調(diào)用,而不必知道其內(nèi)部實(shí)現(xiàn)的過程,只知道它的原型和返回值就可以了.SDK 是英文Software Development Kit的縮寫 ,指 “軟件開發(fā)工具包
8、”,在防火墻的設(shè)計(jì)中就經(jīng)常涉及到SDK 。第二節(jié)Win API編程簡(jiǎn)介下面介紹一下WIN API.我們需要自己編寫一個(gè)工具時(shí) ,必然會(huì)用到很多操作 windows 和控制 windows 的函數(shù) ,這些函數(shù)就是 windows API.API 是 Application Progamming Interface的縮寫 .就是說 API 是一系列已經(jīng)定義的在windows內(nèi)部的函數(shù) ,是應(yīng)用程序和系統(tǒng)之間的橋梁 ,應(yīng)用程序通過調(diào)用API 來請(qǐng)求系統(tǒng)完成一系列的任務(wù).窗口 ,菜單 ,文件操作等都是通過API 實(shí)現(xiàn)的 .WIN32 API 就是 WINDOWS 32 位平臺(tái)的應(yīng)用程序接口 .現(xiàn)在可視
9、化編程工具提供了大量控件 ,他們代替了 API 的功能 .這些控件都是構(gòu)建在 WIN32 API之上的 .是封裝了的API 函數(shù)集合 .但是對(duì)于比較復(fù)雜和特殊功能(想我們的黑客編程 )來說 ,就必須用API 函數(shù)來實(shí)現(xiàn) .WIN API存放在動(dòng)態(tài)鏈接庫(DLL) 中 ,在 98 系統(tǒng)中 ,有 32 位的GDI32.DLL,KERNEL32.DLL,16位的 GDI.EXE,動(dòng)態(tài)鏈接庫中 .木馬和后門其實(shí)就是使用了文件操作函數(shù),這里做簡(jiǎn)要介紹:刪除文件 :BOOL DeleteFile(LPCTSH lpFileName)復(fù)制文件 :BOOL CopyFile()移動(dòng)文件 :BOOL MoveF
10、ile()等等具體的 API 可以上網(wǎng)自己去查看,有很多介紹API 的書籍 .頁如有你有幫助,請(qǐng)購買下載,謝謝!第二節(jié)Win API編程簡(jiǎn)介下面介紹一下WIN API.我們需要自己編寫一個(gè)工具時(shí) ,必然會(huì)用到很多操作 windows 和控制 windows 的函數(shù) ,這些函數(shù)就是 windows API.API 是 Application Progamming Interface的縮寫 .就是說 API 是一系列已經(jīng)定義的在windows內(nèi)部的函數(shù) ,是應(yīng)用程序和系統(tǒng)之間的橋梁 ,應(yīng)用程序通過調(diào)用API 來請(qǐng)求系統(tǒng)完成一系列的任務(wù).窗口 ,菜單 ,文件操作等都是通過API 實(shí)現(xiàn)的 .WIN32
11、 API 就是 WINDOWS 32 位平臺(tái)的應(yīng)用程序接口 .現(xiàn)在可視化編程工具提供了大量控件 ,他們代替了 API 的功能 .這些控件都是構(gòu)建在 WIN32 API之上的 .是封裝了的API 函數(shù)集合 .但是對(duì)于比較復(fù)雜和特殊功能(想我們的黑客編程 )來說 ,就必須用API 函數(shù)來實(shí)現(xiàn) .WIN API存放在動(dòng)態(tài)鏈接庫(DLL) 中 ,在 98 系統(tǒng)中 ,有 32 位的GDI32.DLL,KERNEL32.DLL,16位的 GDI.EXE,動(dòng)態(tài)鏈接庫中 .木馬和后門其實(shí)就是使用了文件操作函數(shù),這里做簡(jiǎn)要介紹:刪除文件 :BOOL DeleteFile(LPCTSH lpFileName)復(fù)制
12、文件 :BOOL CopyFile()移動(dòng)文件 :BOOL MoveFile()等等具體的 API 可以上網(wǎng)自己去查看,有很多介紹API 的書籍 .第二節(jié)Win API編程簡(jiǎn)介下面介紹一下WIN API.我們需要自己編寫一個(gè)工具時(shí) ,必然會(huì)用到很多操作 windows 和控制 windows 的函數(shù) ,這些函數(shù)就是 windows API.API 是 Application Progamming Interface的縮寫 .就是說 API 是一系列已經(jīng)定義的在windows內(nèi)部的函數(shù) ,是應(yīng)用程序和系統(tǒng)之間的橋梁 ,應(yīng)用程序通過調(diào)用API 來請(qǐng)求系統(tǒng)完成一系列的任務(wù).窗口 ,菜單 ,文件操作等
13、都是通過API 實(shí)現(xiàn)的 .頁如有你有幫助,請(qǐng)購買下載,謝謝!WIN32 API 就是 WINDOWS 32 位平臺(tái)的應(yīng)用程序接口 .現(xiàn)在可視化編程工具提供了大量控件 ,他們代替了 API 的功能 .這些控件都是構(gòu)建在 WIN32 API之上的 .是封裝了的API 函數(shù)集合 .但是對(duì)于比較復(fù)雜和特殊功能(想我們的黑客編程 )來說 ,就必須用API 函數(shù)來實(shí)現(xiàn) .WIN API存放在動(dòng)態(tài)鏈接庫(DLL) 中 ,在 98 系統(tǒng)中 ,有 32 位的GDI32.DLL,KERNEL32.DLL,16位的 GDI.EXE,動(dòng)態(tài)鏈接庫中 .木馬和后門其實(shí)就是使用了文件操作函數(shù),這里做簡(jiǎn)要介紹:刪除文件 :B
14、OOL DeleteFile(LPCTSH lpFileName)復(fù)制文件 :BOOL CopyFile()移動(dòng)文件 :BOOL MoveFile()等等具體的 API 可以上網(wǎng)自己去查看,有很多介紹API 的書籍 .第三節(jié)Windows網(wǎng)絡(luò)協(xié)議首先介紹一下網(wǎng)絡(luò)協(xié)議:網(wǎng)絡(luò)協(xié)議是網(wǎng)絡(luò)上所有設(shè)備之間通信規(guī)則的集合,他定義了通信時(shí)信息必須采用的格式和這些格式的意義.大多數(shù)網(wǎng)絡(luò)協(xié)議都采用分層體系結(jié),每一層都建立在他的下層之上,向他的上一層提供服務(wù),而把如何實(shí)現(xiàn)這一服務(wù)的細(xì)節(jié)對(duì)上層加以屏蔽.一臺(tái)設(shè)備上的第 N 層與另一臺(tái)設(shè)備上的第N 層進(jìn)行通信的規(guī)則就是第N 曾協(xié)議 .在網(wǎng)絡(luò)上的個(gè)層之間中存在著許多協(xié)議
15、,接受方和發(fā)送方同層的協(xié)議必須一致,否則 ,一方就無法識(shí)別另一方發(fā)出的信息.網(wǎng)絡(luò)協(xié)議使網(wǎng)絡(luò)上的設(shè)備各種設(shè)備能相互交換信息.常用的協(xié)議有:TCP/IP 協(xié)議 ,IPX/SPX歇息等等 .在局域網(wǎng)中常用的IPX/SPX協(xié)議 .而訪問INTERNET, 就必須添加TCP/IP 協(xié)議 .TCP/IP 協(xié)議是傳輸控制協(xié)議/互聯(lián)網(wǎng)絡(luò)協(xié)議.他規(guī)范了網(wǎng)絡(luò)上所有設(shè)備的通信,尤其是一個(gè)主機(jī)與另一個(gè)主機(jī)之間的數(shù)據(jù)往來格式以及傳送方式 .在網(wǎng)絡(luò)的各層中還存在著許多協(xié)議,下面列出部分網(wǎng)絡(luò)協(xié)議規(guī)范:ARP地址解析協(xié)議SNMP網(wǎng)絡(luò)管理協(xié)議BOOTP讓無盤站從一個(gè)中心服務(wù)器上獲得IP 地址DHCP動(dòng)態(tài)主機(jī)配置協(xié)議頁如有你有幫
16、助,請(qǐng)購買下載,謝謝!下面介紹網(wǎng)絡(luò)7 層協(xié)議在 WINDOWS的實(shí)現(xiàn) :7 層協(xié)議WIN 系統(tǒng)_7應(yīng)用層7 應(yīng)用程序_6表示層6 WINSOCK API(DLL)_5會(huì)話層5 SPI(DLL)_4傳輸層4 TDI(VXD,SYS)_3網(wǎng)絡(luò)層3 NDIS(VXD,SYS)_2數(shù)據(jù)鏈路層2 網(wǎng)卡驅(qū)動(dòng)程序(VXD,SYS)_1物理層1網(wǎng)卡_相信這個(gè)映射圖可以讓大家比較清楚了解他們的對(duì)應(yīng)關(guān)系TCP 協(xié)議圖示應(yīng)用程序協(xié)議HTTP FTP TELNET傳輸協(xié)議TCP UDP網(wǎng)際協(xié)議IP物理層協(xié)議網(wǎng)卡IP 協(xié)議保證數(shù)據(jù)的傳輸,TCP 協(xié)議保證數(shù)據(jù)傳輸?shù)馁|(zhì)量.TCP/IP 協(xié)議基于四層結(jié)構(gòu) :應(yīng)用層 ,傳輸層
17、 ,網(wǎng)絡(luò)層 ,接口層 , 數(shù)據(jù)在傳輸時(shí)每通過一層就要在數(shù)據(jù)上加個(gè)頭 ,其中的數(shù)據(jù)供接受端同層使用 ,在接收端 ,每經(jīng)過一層就把頭去掉,來保證傳輸數(shù)據(jù)格式的一致.TCP 頭部結(jié)構(gòu) :16 位源端口號(hào)16 位目的端口號(hào)_頁如有你有幫助,請(qǐng)購買下載,謝謝!_位序列號(hào)_位確認(rèn)號(hào)_4 位首部長(zhǎng)度 +6 位保留字6 位標(biāo)志16 位窗口大小_16 位效驗(yàn)和16 位緊急數(shù)據(jù)偏移量_數(shù)據(jù)段_IP 頭部結(jié)構(gòu) :4 位 IP 版本號(hào)4 位首部長(zhǎng)度8 位服務(wù)類型16 位總長(zhǎng)度_16 位標(biāo)示3 位標(biāo)志和偏移_8 位生存時(shí)間8 位協(xié)議16 位 IP 首部效驗(yàn)和_32 位源 IP 地址_32 位目的 IP 地址_TCP 頭
18、和數(shù)據(jù)_頁如有你有幫助,請(qǐng)購買下載,謝謝!第四節(jié)關(guān)于服務(wù)器和客戶端編程在網(wǎng)絡(luò)編程中 , 最常用和最基礎(chǔ)的就是 WINSOCK. 現(xiàn)在我們討論 WINDOWS 下的 SOCKET 編程 .大凡在 WIN32 平臺(tái)上的WINSOCK編程都要經(jīng)過下列步驟:定義變量 -獲得 WINDOCK 版本 -加載 WINSOCK 庫- 初始化 - 創(chuàng)建套接字 - 設(shè)置套接字選項(xiàng) -關(guān)閉套接字 - 卸載 WINSOCK 庫 -釋放資源下面介紹WINSOCK C/S的建立過程 :服務(wù)器客戶端_1 初始化 WSA1初始化 WSA_2 建立一個(gè) SOCKET2 建立一個(gè)SOCKET_3 綁定 SOCKET3 連接到服務(wù)
19、器_4 在指定的端口監(jiān)聽4發(fā)送和接受數(shù)據(jù)_5 接受一個(gè)連接5斷開連接_-發(fā)送和接受數(shù)據(jù)_斷開連接_大家注意 ,在 VC 中進(jìn)行 WINSOCK編程時(shí) ,需要引入如下兩個(gè)庫文件:WINSOCK.H( 這個(gè)是 WINSOCK API 的頭文件 ,WIN2K 以上支持 WINSOCK2, 所以可以用 WINSOCK2.H);Ws2_32.lib(WINSOCK API連接庫文件 ).使用方式如下 :#include #pragma comment(lib,ws2_32.lib)下面我們通過具體的代碼演示服務(wù)器和客戶端的工作流程:頁如有你有幫助,請(qǐng)購買下載,謝謝!首先 ,建立一個(gè) WSADATA結(jié)構(gòu)
20、,通常用 wsaDataWSADATA wsaData;然后 ,調(diào)用 WSAStartup函數(shù) ,這個(gè)函數(shù)是連接應(yīng)用程序與winsock.dll的第一個(gè)調(diào)用 . 其中 ,第一個(gè)參數(shù)是WINSOCK版本號(hào) ,第二個(gè)參數(shù)是指向WSADATA的指針 .該函數(shù)返回一個(gè)INT 型值 ,通過檢查這個(gè)值來確定初始化是否成功.調(diào)用格式如下 :WSAStartup(MAKEWORD(2,2),wsaData),其中MAKEWORD(2,2)表示使用 WINSOCK2版本 .wsaData用來存儲(chǔ)系統(tǒng)傳回的關(guān)于WINSOCK的資料 .if(iResuit=WSAStartup(MAKEWORD(2,2),wsaD
21、ata)!=0)printf(WSAStartup failed:%d,GetLastError(); /返回值不等與0,說明初始化失敗ExitProcess();/ 退出程序應(yīng)用程序在完成對(duì)請(qǐng)求的 SOCKET 庫使用后 ,要調(diào)用 WSACleanup 函數(shù)來接觸 SOCKET 庫的綁定 ,并且釋放資源 .注意 WSAStartup初始化后 ,必須建立一個(gè)SOCKET 結(jié)構(gòu)來保存SOCKET句柄 .下面我們建立一個(gè)SOCKET.首先我們建立一個(gè) m_socket 的 SOCKET 句柄 ,接著調(diào)用 socket() 函數(shù) ,函數(shù)返回值保存在 m_socket 中 .我們使用 AF_INFE,
22、SOCK_STREAM,IPPROTO_TCP三個(gè)參數(shù) .第一個(gè)表示地址族,AF_INFE表示 TCP/IP 族 , 第二個(gè)表示服務(wù)類型,在 WINSOCK2中,SOCKET 支持以下三種類型 ;SOCK_STREAM流式套接字SOCK_DGRAM數(shù)據(jù)報(bào)套接字SOCK_RAW原始套接字第三個(gè)參數(shù)表示協(xié)議:IPPROTO_UDP UDP協(xié)議用于無連接數(shù)據(jù)報(bào)套接字IPPROTO_TCP TCP協(xié)議 用于流式套接字IPPROTO_ICMP ICMP協(xié)議用于原始套接字頁如有你有幫助,請(qǐng)購買下載,謝謝!m_socket=socket(AF_INFE,SOCK_STREAM,IPPROTO_TCP);/創(chuàng)
23、建 TCP 協(xié)議以下代碼用于檢查返回值是否有錯(cuò)誤:if(m_scoket=INVALID_SOCKET)prinrf(Error at socket():%dn,GetLastError();WSACleanup();/ 釋放資源return;說明 ,如果 socket() 調(diào)用失敗 ,他將返回INVALID_SOCKET.為了服務(wù)器能接受一個(gè)連接 ,他必須綁定一個(gè)網(wǎng)絡(luò)地址 ,下面的代碼展示如何綁定一個(gè)已經(jīng)初始化的 IP 和端口的 Socket. 客戶端程序用這個(gè)IP 地址和端口來連接服務(wù)器.sockaddr_in service;service.sin_family=AF_INET;/INT
24、ERNET地址族/將要綁定的本地IP 地址service.sin_port=htons(27015);/27015將要綁定的端口下面我們調(diào)用BIND 函數(shù) ,把 SOCKET和 SOCKADDR以參數(shù)的形式傳入,并檢查錯(cuò)誤 .if(bind(m_socket,(SOCKADDR*)SERVICE,sizeof(service)=SOCKET_ERROR)printf(bind() failed.n);closesocket(m_socket);return;當(dāng)綁定完成后 ,服務(wù)器必須建立一個(gè)監(jiān)聽隊(duì)列 ,以接受客戶端的請(qǐng)求 .listen() 使服務(wù)器進(jìn)入監(jiān)聽狀態(tài) ,該函數(shù)調(diào)用成功返回 0,否則
25、返回SOCKET_ERROR.代碼如下 :if(listen(m_socket,1)=SOCKET-ERROR)頁如有你有幫助,請(qǐng)購買下載,謝謝!printf(error listening on socket.n);服務(wù)器端調(diào)用完LISTEN() 后 ,如果此時(shí)客戶端調(diào)用CONNECT()函數(shù) , 服務(wù)器端必須在調(diào)用ACCEPT(). 這樣服務(wù)器和客戶端才算正式完成通信程序的連接動(dòng)作 .一旦服務(wù)器開始監(jiān)聽,我們就要指定一個(gè)句柄來表示利用ACCEPT() 函數(shù)接受的連接,這個(gè)句柄是用來發(fā)送和接受數(shù)據(jù)的表示. 建立一個(gè)SOCKET 句柄Socket AcceptSocket然后利用無限循環(huán)來檢測(cè)
26、是否有連接傳入.一但有連接請(qǐng)求,ACCEPT() 函數(shù)就會(huì)被調(diào)用,并且返回這次連接的句柄.printf(waitong for a client to connect.n);while(1)AcceptSocket=SOCKET_ERROR;while(AcceptSocket=SOCKET_ERROR)AcceptSocket=accept(m_socket,NULL,NULL);下面看客戶端端代碼:sockaddr_in clientService;clientService.sin_family=AF_INET;/INTERNET地址族/將要綁定的本地IP 地址clientService
27、.sin_port=htons(27015);/27015將要綁定的端口下面調(diào)用 CONNECT()函數(shù) :if ( connect( m_socket, (SOCKADDR*) clientService, sizeof(clientService) ) =SOCKET_ERROR)printf( Failed to connect.n );WSACleanup();return;頁如有你有幫助,請(qǐng)購買下載,謝謝!/如果調(diào)用失敗清理退出/調(diào)用成功繼續(xù)讀寫數(shù)據(jù)_到這里 ,服務(wù)器和客戶端的基本流程介紹完畢, 下面我們介紹數(shù)據(jù)交換.send():int sendSOCKET s,/ 指定發(fā)送端套接
28、字const char FAR?*buf,/指明一個(gè)存放應(yīng)用程序要發(fā)送的數(shù)據(jù)的緩沖區(qū)int len,/實(shí)際要發(fā)送的數(shù)據(jù)字節(jié)數(shù)int flags/ 一般設(shè)置為0;C/S 都用 SEND 函數(shù)向 TCP 連接的另一端發(fā)送數(shù)據(jù).recv():int recvSOCKET s,/ 指定發(fā)送端套接字char FAR?*buf,/ 指明一個(gè)緩沖區(qū)存放 RECC 受到的數(shù)據(jù)int len,/指明 BUF 的長(zhǎng)度int flags/ 一般設(shè)置為0;C/S 都使用 RECV 函數(shù)從 TCP 連接的另一端接受數(shù)據(jù)_下面將完整的程序代碼提供如下, 大家可直接編譯運(yùn)行首先看客戶端的代碼:頁如有你有幫助,請(qǐng)購買下載,謝
29、謝!#include #include #pragma comment(lib, ws2_32.lib)void main() / 初始化Winsock.WSADATA wsaData;int iResult = WSAStartup( MAKEWORD(2,2), wsaData );if ( iResult != NO_ERROR )printf(Error at WSAStartup()n);/ 建立 socket socket.SOCKET client;client = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );if ( client =
30、 INVALID_SOCKET ) printf( Error at socket(): %ldn, WSAGetLastError() );WSACleanup();return;/ 連接到服務(wù)器.sockaddr_in clientService;clientService.sin_family = AF_INET;clientService.sin_port = htons( 27015 );if ( connect( client, (SOCKADDR*) clientService, sizeof(clientService) ) = SOCKET_ERROR) printf( Fa
31、iled to connect.n );WSACleanup();return;/ 發(fā)送并接收數(shù)據(jù).int bytesSent;int bytesRecv = SOCKET_ERROR;頁如有你有幫助,請(qǐng)購買下載,謝謝!char sendbuf32 = Client: Sending data.;char recvbuf32 = ;bytesSent = send( client, sendbuf, strlen(sendbuf), 0 );printf( Bytes Sent: %ldn, bytesSent );while( bytesRecv = SOCKET_ERROR ) bytes
32、Recv = recv( client, recvbuf, 32, 0 );if ( bytesRecv = 0 | bytesRecv = WSAECONNRESET ) printf( Connection Closed.n);break;if (bytesRecv 0)return;printf( Bytes Recv: %ldn, bytesRecv );return;下面是服務(wù)器端代碼:#include #include #pragma comment(lib, ws2_32.lib)void main() / 初始化WSADATA wsaData;int iResult = WSA
33、Startup( MAKEWORD(2,2), wsaData );if ( iResult != NO_ERROR )printf(Error at WSAStartup()n);/建立 socketSOCKET server;server = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );頁如有你有幫助,請(qǐng)購買下載,謝謝!if ( server = INVALID_SOCKET ) printf( Error at socket(): %ldn, WSAGetLastError() );WSACleanup();return;/ 綁定 socket
34、sockaddr_in service;service.sin_family = AF_INET;service.sin_port = htons( 27015 );if ( bind( server, (SOCKADDR*) service, sizeof(service) ) = SOCKET_ERROR ) printf( bind() failed.n );closesocket(server);return;/ 監(jiān)聽socketif ( listen( server, 1 ) = SOCKET_ERROR )printf( Error listening on socket.n);/
35、接受連接SOCKET AcceptSocket;printf( Waiting for a client to connect.n );while (1) AcceptSocket = SOCKET_ERROR;while ( AcceptSocket = SOCKET_ERROR ) AcceptSocket = accept( server, NULL, NULL );printf( Client Connected.n);server = AcceptSocket;break;/ 發(fā)送接受數(shù)據(jù)頁如有你有幫助,請(qǐng)購買下載,謝謝!int bytesSent;int bytesRecv = SOCKET_ERROR;char sendbuf32 = Server: Sending Data.;char recvbuf32 = ;bytesRecv = recv( server, recvbuf, 32, 0 )
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 郫縣電梯加裝施工方案
- 2025屆湖南省張家界市名校中考生物五模試卷含解析
- 出售廣東漁船合同范例
- 專題01 聲現(xiàn)象(3大模塊知識(shí)清單+3個(gè)易混易錯(cuò)+2種方法技巧+典例真題精析)-2025年中考地理一輪復(fù)習(xí)知識(shí)清單
- 單位共有房屋買賣合同范例
- 多媒體教學(xué)計(jì)劃
- 眼科手術(shù)患者護(hù)理
- 員工福利的改進(jìn)與落實(shí)計(jì)劃
- 環(huán)保與可持續(xù)發(fā)展計(jì)劃
- 班主任的班級(jí)學(xué)習(xí)目標(biāo)計(jì)劃
- 卷揚(yáng)機(jī)驗(yàn)收表格
- TensorFlow+Keras深度學(xué)習(xí)人工智能實(shí)踐應(yīng)用
- 自驅(qū)型成長(zhǎng):如何培養(yǎng)孩子的自律力
- 談心談話記錄100條范文(6篇)
- 物聯(lián)網(wǎng)設(shè)備管理平臺(tái)項(xiàng)目實(shí)施服務(wù)方案
- 機(jī)械加工廠安全生產(chǎn)和環(huán)境保護(hù)應(yīng)急預(yù)案
- (完整word版)A3試卷模板
- 2023年福建省中考英語聽力試題(試題卷+音頻+錄音原文)
- 公司的JMP軟件培訓(xùn)教程
- 筑基功法精選
- 歐洲電力市場(chǎng)深度報(bào)告:歐洲電力市場(chǎng)供需格局和電價(jià)分析
評(píng)論
0/150
提交評(píng)論