網(wǎng)絡(luò)編程基礎(chǔ)(免費(fèi))
《網(wǎng)絡(luò)編程基礎(chǔ)(免費(fèi))》由會(huì)員分享,可在線閱讀,更多相關(guān)《網(wǎng)絡(luò)編程基礎(chǔ)(免費(fèi))(21頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、網(wǎng)絡(luò)和編程基本知識(shí) 第一節(jié) 了解Windows機(jī)制Windows 是一個(gè)“基于事件的,消息驅(qū)動(dòng)的”操作系統(tǒng)。在Windows下執(zhí)行一個(gè)程序,只要用戶進(jìn)行了影響窗口的動(dò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è)“消息”,從而使程序可以處理該事件。 每個(gè)Windows 應(yīng)用程序都是基于事件和
2、消息的,而且包含一個(gè)主事件循環(huán),它不停地、反復(fù)地檢測(cè)是否有用戶事件發(fā)生。每次檢測(cè)到一個(gè)用戶事件,程序就對(duì)該事件做出響應(yīng),處理完再等待下一個(gè)事件的發(fā)生。 Windows 下的應(yīng)用程序不斷地重復(fù)這一過(guò)程,直至用戶終止程序,用代碼來(lái)描述實(shí)際上也就是一個(gè)消息處理過(guò)程的while循環(huán)語(yǔ)句。 下面便簡(jiǎn)單介紹一下與 Windows 系統(tǒng)密切相關(guān)的幾個(gè)基本概念: 1:窗口:這是我要說(shuō)的第一個(gè)概念。窗口是Windows本身以及Windows 環(huán)境下的應(yīng)用程序的基本界面單位,但是很多人都誤以為只有具有 標(biāo)題欄、狀態(tài)欄、最大化、最小化按鈕這樣標(biāo)準(zhǔn)的方框才叫窗口。其實(shí)窗口的概念
3、很廣,例如按鈕和對(duì)話框等也是窗口,只不過(guò)是一種特殊化窗口罷了。 從用戶的角度看,窗口就是顯示在屏幕上的一個(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è)窗口,并在那里默默地等待用戶的要求。每當(dāng)用戶選擇窗口中的選項(xiàng),程序即對(duì)此做出響應(yīng)。 2:程序:通常說(shuō)的程序都是指一個(gè)能讓計(jì)算機(jī)識(shí)別的文件,接觸得最多的便是.exe型的可執(zhí)行文件. 3:進(jìn)程:說(shuō)到進(jìn)程
4、,學(xué)過(guò)《操作系統(tǒng)》的人都很清楚,所謂進(jìn)程就是應(yīng)用程序的執(zhí)行實(shí)例(或稱一個(gè)執(zhí)行程序) 需要注意的是:進(jìn)程是程序動(dòng)態(tài)的描述,而上面說(shuō)到的程序是靜態(tài)的描述,兩者有本質(zhì)的區(qū)別。舉個(gè)例子,從網(wǎng)上 Down了一個(gè)瑞星殺毒軟件到C盤但沒(méi)有運(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ī)器是否啟動(dòng)。 4:線程:線程是進(jìn)程中
5、的一個(gè)執(zhí)行單元,同一個(gè)進(jìn)程中的各個(gè)線程對(duì)應(yīng)于一組CPU指令、一組CPU寄存器以及一堆棧。進(jìn)程本來(lái)就具有動(dòng)態(tài)的含義,然而實(shí)質(zhì)上是通過(guò)線程來(lái)執(zhí)行體現(xiàn)的,從這個(gè)意義上說(shuō),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消息等等。所有的這些都可以通過(guò)GetMessage,SendMessage等函數(shù)得到. 6:事件:
6、如在程序運(yùn)行的過(guò)程中改變窗口的大小或者移動(dòng)窗口等,都會(huì)觸發(fā)相應(yīng)的“事件”。 7:句柄:?jiǎn)螁我粋€(gè)“柄”字便可以解釋它的意思了,我們天氣熱搖扇子的時(shí)候只要抓住扇柄便可以控制整個(gè)扇子的運(yùn)動(dòng)了,在程序中也差不多是這個(gè)意思。通常一個(gè)句柄就可以傳遞我們所要做的事情。有經(jīng)驗(yàn)的成員肯定清楚,編寫程序總是要和各種句柄打交道的,句柄是系統(tǒng)用來(lái)標(biāo)識(shí)不同對(duì)象類型的工具,如窗口、菜單等,這些東西在系統(tǒng)中被視為不同類型的對(duì)象,用不同的句柄將他們區(qū)分開來(lái)。 C++ 教材中給句柄下的定義是:“在Win32里,句柄是指向一個(gè)無(wú)值型對(duì)象(void *)的指針,是一個(gè)4字節(jié)長(zhǎng)的數(shù)據(jù)”。從結(jié)構(gòu)上看,句柄的確是一個(gè)
7、指針,盡管它沒(méi)有指向用于存儲(chǔ)某個(gè)對(duì)象的內(nèi)存位置,而實(shí)際上在編程時(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)的過(guò)程,只知道它的原型和返回值就可了. SDK是英文 Software Development Kit 的縮寫,指“軟件開發(fā)工具包”,在防火墻的設(shè)計(jì)中就經(jīng)常涉及到SDK。 第二節(jié) Win API編程簡(jiǎn)介
8、 下面介紹一下WIN API. 我們需要自己編寫一個(gè)工具時(shí),必然會(huì)用到很多操作windows和控制windows的函數(shù),這些函數(shù)就是windows API. API是Application Progamming Interface的縮寫.就是說(shuō)API是一系列已經(jīng)定義的在windows內(nèi)部的函數(shù),是應(yīng)用程序和系統(tǒng)之間的橋梁,應(yīng)用程序通過(guò)調(diào)用API來(lái)請(qǐng)求系統(tǒng)完成一系列的任務(wù).窗口,菜單,文件操作等都是通過(guò)API實(shí)現(xiàn)的. WIN32 API就是WINDOWS 32位平臺(tái)的應(yīng)用程序接口.現(xiàn)在可視化編程工具提供了大量控件,他們代替了API的功能.這些控件都是構(gòu)建在WIN
9、32 API之上的.是封裝了的API函數(shù)集合.但是對(duì)于比較復(fù)雜和特殊功能(想我們的黑客編程)來(lái)說(shuō),就必須用API函數(shù)來(lái)實(shí)現(xiàn). WIN API存放在動(dòng)態(tài)鏈接庫(kù)(DLL)中,在98系統(tǒng)中,有32位的GDI32.DLL,KERNEL32.DLL,16位的GDI.EXE,KRNL386.EXE.API就存放在這些動(dòng)態(tài)鏈接庫(kù)中. 木馬和后門其實(shí)就是使用了文件操作函數(shù),這里做簡(jiǎn)要介紹: 刪除文件:BOOL DeleteFile(LPCTSH lpFileName) 復(fù)制文件:BOOL CopyFile() 移動(dòng)文件:BOOL MoveFile()等等
10、 具體的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é)議,接受方和發(fā)送方同層的協(xié)議必須一致, 否則,一方就無(wú)法識(shí)別另一方發(fā)出的信息.網(wǎng)絡(luò)協(xié)議使網(wǎng)絡(luò)上的設(shè)備各種設(shè)備能相互交換信息.
11、 常用的協(xié)議有:TCP/IP協(xié)議,IPX/SPX歇息等等.在局域網(wǎng)中常用的IPX/SPX協(xié)議.而訪問(wèn)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ù)往來(lái)格式以及傳送 方式. 在網(wǎng)絡(luò)的各層中還存在著許多協(xié)議,下面列出部分網(wǎng)絡(luò)協(xié)議規(guī)范: ARP 地址解析協(xié)議 SNMP 網(wǎng)絡(luò)管理協(xié)議 BOOTP 讓無(wú)盤站從一個(gè)中心服務(wù)器上獲得IP地址 DHCP 動(dòng)態(tài)主機(jī)配置協(xié)議 下面介紹網(wǎng)絡(luò)7層協(xié)議在WINDOWS的實(shí)
12、現(xiàn): 7層協(xié)議 WIN系統(tǒng) ________________________________________ 7 應(yīng)用層 7 應(yīng)用程序 ________________________________________________ 6 表示層 6 WINSOCK API(DLL) ___________________________________________ 5 會(huì)話層 5 SPI(DLL) _________________________
13、_________________________ 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
14、物理層 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)用層,傳輸層,網(wǎng)絡(luò)層,接口層,數(shù)據(jù)在傳輸時(shí)每通過(guò)一層就要在數(shù)據(jù)
15、上加個(gè)頭,其中的數(shù)據(jù)供接受端同層使用,在接收端,每經(jīng)過(guò)一層就把頭去掉,來(lái)保證傳輸數(shù)據(jù)格式的一致. TCP頭部結(jié)構(gòu): 16位源端口號(hào) 16位目的端口號(hào) 32位序列號(hào) 32位確認(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、 16位IP首部效驗(yàn)和 32位源IP地址 32位目的IP地址 TCP頭和數(shù)據(jù) 第四節(jié) 關(guān)于服務(wù)器和客戶端編程 在網(wǎng)絡(luò)編程中,最常用和最基礎(chǔ)的就是WINSOCK. 現(xiàn)在我們討論WINDOWS下的SOCKET編程. 大凡在WIN32平臺(tái)上的WINSOCK編程都要經(jīng)過(guò)下列步驟: 定義變量->獲得WINDOCK版本->加載WINSOCK庫(kù)->初始化->創(chuàng)建套接字->設(shè)置套接字選項(xiàng)->關(guān)閉套接字>卸載WINSOCK庫(kù)->釋放資源 下面介紹WINSOCK C/S的建立過(guò)程: 服務(wù)器
17、 客戶端 ________________________________________________ 1 初始化WSA 1 初始化WSA ____________________________________________________ 2 建立一個(gè)SOCKET 2 建立一個(gè)SOCKET _____________________________________________________ 3 綁定SOCKE
18、T 3 連接到服務(wù)器 _____________________________________________________ 4 在指定的端口監(jiān)聽 4 發(fā)送和接受數(shù)據(jù) _____________________________________________________ 5 接受一個(gè)連接 5 斷開連接 ______________________________________________________- 6
19、發(fā)送和接受數(shù)據(jù) ___________________________________________________ 7 斷開連接 __________________________________________________ 大家注意,在VC中進(jìn)行WINSOCK編程時(shí),需要引入如下兩個(gè)庫(kù)文件:WINSOCK.H(這個(gè)是WINSOCK API的頭文件,WIN2K以上支持WINSOCK2,所以 可以用WINSOCK2.H);Ws2_32.lib(WINSOCK API連接庫(kù)文件). 使用方式如下: #include
20、
21、&wsaData),其中 MAKEWORD(2,2)表示使用WINSOCK2版本.wsaData用來(lái)存儲(chǔ)系統(tǒng)傳回的關(guān)于WINSOCK的資料. if(iResuit=WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("WSAStartup failed:%d",GetLastError()); //返回值不等與0,說(shuō)明初始化失敗 ExitProcess(); / 本篇文章來(lái)源于 黑客基地-全球最大的中文黑客站 原文鏈接:
22、網(wǎng)絡(luò)和黑客編程基本知識(shí) (5)2009-06-18 09:54:18 來(lái)源:互聯(lián)網(wǎng) 網(wǎng)絡(luò)和黑客編程基本知識(shí) 第一節(jié) 了解Windows機(jī)制Windows 是一個(gè)“基于事件的,消息驅(qū)動(dòng)的”操作系統(tǒng)。在Windows下執(zhí)行一個(gè)程序,只要用戶進(jìn)行了影響窗口的動(dòng)作... //退出程序 } 應(yīng)用程序在完成對(duì)請(qǐng)求的SOCKET庫(kù)使用后,要調(diào)用WSACleanup函數(shù)來(lái)接觸SOCKET庫(kù)的綁定,并且釋放資源. 注意WSAStartup初始化后,必須建立一個(gè)SOCKET結(jié)構(gòu)來(lái)保存SOCKET句柄. 下面我們建立一個(gè)SOCKET. 首先我們建立一個(gè)
23、m_socket的SOCKET句柄,接著調(diào)用socket()函數(shù),函數(shù)返回值保存在m_socket中.我們使用AF_INFE,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é)議 用于無(wú)連接數(shù)據(jù)報(bào)套接字 IPPROTO_TCP
24、TCP協(xié)議 用于流式套接字 IPPROTO_ICMP ICMP協(xié)議用于原始套接字 m_socket=socket(AF_INFE,SOCK_STREAM,IPPROTO_TCP); //創(chuàng)建TCP協(xié)議 以下代碼用于檢查返回值是否有錯(cuò)誤: if(m_scoket==INVALID_SOCKET) { prinrf("Error at socket():%d\n",GetLastError()); WSACleanup(); //釋放資源 ret
25、urn; } 說(shuō)明,如果socket()調(diào)用失敗,他將返回INVALID_SOCKET. 為了服務(wù)器能接受一個(gè)連接,他必須綁定一個(gè)網(wǎng)絡(luò)地址,下面的代碼展示如何綁定一個(gè)已經(jīng)初始化的IP和端口的Socket.客戶端程序用這個(gè) IP地址和端口來(lái)連接服務(wù)器. sockaddr_in service; service.sin_family=AF_INET; //INTERNET地址族 service.sin_addr.s_addr=inet_addr("127.0.0.1"); //將要
26、綁定的本地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)綁
27、定完成后,服務(wù)器必須建立一個(gè)監(jiān)聽隊(duì)列,以接受客戶端的請(qǐng)求.listen()使服務(wù)器進(jìn)入監(jiān)聽狀態(tài),該函數(shù)調(diào)用成功返回0,否則返回 SOCKET_ERROR.代碼如下: if(listen(m_socket,1)==SOCKET-ERROR) { 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)聽,我們就
28、要指定一個(gè)句柄來(lái)表示利用ACCEPT()函數(shù)接受的連接,這個(gè)句柄是用來(lái)發(fā)送和接受數(shù)據(jù)的表示.建立一個(gè)SOCKET句柄 Socket AcceptSocket 然后利用無(wú)限循環(huán)來(lái)檢測(cè)是否有連接傳入.一但有連接請(qǐng)求,ACCEPT()函數(shù)就會(huì)被調(diào)用,并且返回這次連接的句柄. printf("waitong for a client to connect...\n"); while(1) { AcceptSocket=SOCKET_ERROR; while(AcceptSocket==SOCKET_ERROR) { Acc
29、eptSocket=accept(m_socket,NULL,NULL); } } 下面看客戶端端代碼: sockaddr_in clientService; clientService.sin_family=AF_INET; 本篇文章來(lái)源于 黑客基地-全球最大的中文黑客站 原文鏈接: 網(wǎng)絡(luò)和黑客編程基本知識(shí) (6)2009-06-18 09:54:18 來(lái)源:互聯(lián)網(wǎng) 網(wǎng)絡(luò)和黑客編程基本知識(shí) 第一節(jié) 了解Windows機(jī)制Windows 是一個(gè)“基于事件的,消息驅(qū)動(dòng)的”操作系統(tǒng)。在Windows下執(zhí)行一個(gè)程序,只
30、要用戶進(jìn)行了影響窗口的動(dòng)作... ; //INTERNET地址族 clientService.sin_addr.s_addr=inet_addr("127.0.0.1"); //將要綁定的本地IP地址 clientService.sin_port=htons(27015); //27015將要綁定的端口 下面調(diào)用CONNECT()函數(shù): if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientServ
31、ice) ) == SOCKET_ERROR) { printf( "Failed to connect.\n" ); WSACleanup(); return; } //如果調(diào)用失敗清理退出 //調(diào)用成功繼續(xù)讀寫數(shù)據(jù) 到這里,服務(wù)器和客戶端的基本流程介紹完畢,下面我們介紹數(shù)據(jù)交換. send(): int send { SOCKET s,
32、 //指定發(fā)送端套接字 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 recv { SOCKET s, //指定發(fā)送端套接字
33、
char FAR?*buf, //指明一個(gè)緩沖區(qū) 存放RECC受到的數(shù)據(jù)
int len, //指明BUF的長(zhǎng)度
int flags //一般設(shè)置為0
};
C/S都使用RECV函數(shù)從TCP連接的另一端接受數(shù)據(jù)
首先看客戶端的代碼:
#include
34、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 ( clie
35、nt == INVALID_SOCKET ) { printf( "Error at socket(): %ld\n", WSAGetLastError() ); WSACleanup(); return; } // 連接到服務(wù)器. sockaddr_in clientService; clientService.sin_family = AF_INET 本篇文章來(lái)源于 黑客基地-全球最大的中文黑客站 原文鏈接: 網(wǎng)絡(luò)和黑客編程基本知識(shí) (7) 2009-06-18 09:54:18????來(lái)源:互聯(lián)網(wǎng)
36、網(wǎng)絡(luò)和黑客編程基本知識(shí) 第一節(jié) 了解Windows機(jī)制Windows 是一個(gè)“基于事件的,消息驅(qū)動(dòng)的”操作系統(tǒng)。在Windows下執(zhí)行一個(gè)程序,只要用戶進(jìn)行了影響窗口的動(dòng)作... ; clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" ); clientService.sin_port = htons( 27015 ); if ( connect( client, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) { pr
37、intf( "Failed to connect.\n" ); WSACleanup(); return; } // 發(fā)送并接收數(shù)據(jù). int bytesSent; int bytesRecv = SOCKET_ERROR; char sendbuf[32] = "Client: Sending data."; char recvbuf[32] = ""; bytesSent = send( client, sendbuf, strlen(sendbuf), 0 ); printf( "Bytes Sent: %ld\n", byte
38、sSent ); while( bytesRecv == SOCKET_ERROR ) { bytesRecv = recv( client, recvbuf, 32, 0 ); if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) { printf( "Connection Closed.\n"); break; } if (bytesRecv < 0) return; printf( "Bytes Recv: %ld\n", bytesRecv ); } return;
39、 }
下面是服務(wù)器端代碼:
#include
40、rver; server = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( server == INVALID_SOCKET ) { printf( "Error at socket(): %ld\n", WSAGetLastError() ); WSACleanup(); return; } // 綁定socket sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = inet_a
41、ddr( "127.0.0.1" ); service.sin_port = htons( 27015 ); if ( bind( server, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) { printf( "bind() failed.\n" ); closesocket(server); return; } // 監(jiān)聽 socket if ( listen( server, 1 ) == SOCKET_ERROR ) printf( "Error listeni
42、ng on socket.\n"); // 接受連接 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 = Ac
43、ceptSocket; break; } // 發(fā)送接受數(shù)據(jù) int bytesSent; int bytesRecv = SOCKET_ERROR; char sendbuf[32] = "Server: Sending Data."; char recvbuf[32] = ""; bytesRecv = recv( server, recvbuf, 32, 0 ); printf( "Bytes Recv: %ld\n", bytesRecv ); bytesSent = send( server, sendbuf, strlen
44、(sendbuf), 0 ); printf( "Bytes Sent: %ld\n", bytesSent ); return; } 本程序僅僅描述了同步的情況! 第五節(jié) 多線程編程介紹 對(duì)于多線程的基本概念,我不在贅述,是個(gè)只要學(xué)習(xí)過(guò)一門編程語(yǔ)言就應(yīng)該多進(jìn)程和線程有個(gè)基本的了解.這里重點(diǎn)介紹一下如何實(shí)現(xiàn)多線程. 通常一個(gè)程序的主線程有操作系統(tǒng)創(chuàng)建,如果想讓其創(chuàng)建額外的線程,可以調(diào)用CreateThread()函數(shù)來(lái)完成.函數(shù)原形如下: 網(wǎng)絡(luò)和黑客編程基本知識(shí) (8)2009-06-18 09:54:18 來(lái)源:互聯(lián)網(wǎng) 網(wǎng)絡(luò)和黑客編程基
45、本知識(shí) 第一節(jié) 了解Windows機(jī)制Windows 是一個(gè)“基于事件的,消息驅(qū)動(dòng)的”操作系統(tǒng)。在Windows下執(zhí)行一個(gè)程序,只要用戶進(jìn)行了影響窗口的動(dòng)作... HANDLE CreateThread() { LPSECURITY_ATTRIBUTES LPThreadAttributes, //指向SECURITY_ATTRIBUTES的指針 SIZE_T dwStackSize, //表示線程為自己所用堆棧分配的地址空間的大小 系統(tǒng)缺省值為0 LPTHREAD_START-TOUTINE lpS
46、tartAddress, //表示新線程開始執(zhí)行時(shí)代碼所在函數(shù)的地址 即線程函數(shù)名 LPVOID lpParameter, //是傳入線程函數(shù)的參數(shù) DWORD dwCreationFlags, //指定控制線程創(chuàng)建的附加標(biāo)志 取0線程立即執(zhí)行 取CREATE_SUSPENDED線程掛起 LPDWORD lpThreadld //是個(gè)DWORD類型的地址,返回賦給該新線程的ID } 線程函數(shù)lpParam
47、eter必須有以下原形:
DWORD WINAPI XXXThreadFun(LPVOID lpParameter)
{
return(0);
}
__________________________________________________
下面我們來(lái)創(chuàng)建一個(gè)線程:
#include
48、沒(méi)什么兩樣 { printf( "Parameter = %d.", *(DWORD*)lpParam ); return 0; } VOID main( VOID ) { DWORD dwThreadId, dwThrdParam = 1; HANDLE hThread; hThread = CreateThread( NULL,0,ThreadFunc,&dwThrdParam, 0,&dwThreadId); if (hThread == NULL) { printf(
49、 "CreateThread failed (%d)\n", GetLastError() ); } else { _getch(); CloseHandle( hThread ); } } 關(guān)于線程同步的問(wèn)題,這里就不再講解,請(qǐng)大家自己查閱資料,不查閱以后可能會(huì)有困難啊.培養(yǎng)一下各位的自己動(dòng)手能力. 本篇文章來(lái)源于 黑客基地-全球最大的中文黑客站 原文鏈接: 網(wǎng)絡(luò)和黑客編程基本知識(shí) (8)2009-06-18 09:54:18 來(lái)源:互聯(lián)網(wǎng) 網(wǎng)絡(luò)和黑客編程基本知識(shí) 第一節(jié) 了解Window
50、s機(jī)制Windows 是一個(gè)“基于事件的,消息驅(qū)動(dòng)的”操作系統(tǒng)。在Windows下執(zhí)行一個(gè)程序,只要用戶進(jìn)行了影響窗口的動(dòng)作... HANDLE CreateThread() { LPSECURITY_ATTRIBUTES LPThreadAttributes, //指向SECURITY_ATTRIBUTES的指針 SIZE_T dwStackSize, //表示線程為自己所用堆棧分配的地址空間的大小 系統(tǒng)缺省值為0 LPTHREAD_START-TOUTINE lpStartAddress,
51、 //表示新線程開始執(zhí)行時(shí)代碼所在函數(shù)的地址 即線程函數(shù)名 LPVOID lpParameter, //是傳入線程函數(shù)的參數(shù) DWORD dwCreationFlags, //指定控制線程創(chuàng)建的附加標(biāo)志 取0線程立即執(zhí)行 取CREATE_SUSPENDED線程掛起 LPDWORD lpThreadld //是個(gè)DWORD類型的地址,返回賦給該新線程的ID } 線程函數(shù)lpParameter必須有以下原形:
52、 DWORD WINAPI XXXThreadFun(LPVOID lpParameter)
{
return(0);
}
__________________________________________________
下面我們來(lái)創(chuàng)建一個(gè)線程:
#include
53、 printf( "Parameter = %d.", *(DWORD*)lpParam ); return 0; } VOID main( VOID ) { DWORD dwThreadId, dwThrdParam = 1; HANDLE hThread; hThread = CreateThread( NULL,0,ThreadFunc,&dwThrdParam, 0,&dwThreadId); if (hThread == NULL) { printf( "CreateThread failed (%d)\n", GetLastError() ); } else { _getch(); CloseHandle( hThread ); } } 關(guān)于線程同步的問(wèn)題,這里就不再講解,請(qǐng)大家自己查閱資料,不查閱以后可能會(huì)有困難啊.培養(yǎng)一下各位的自己動(dòng)手能力. 本篇文章來(lái)源于 黑客基地-全球最大的中文黑客站 原文鏈接:
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運(yùn)動(dòng)會(huì)安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個(gè)人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動(dòng)總結(jié)+在機(jī)關(guān)“弘揚(yáng)憲法精神推動(dòng)發(fā)改工作高質(zhì)量發(fā)展”專題宣講報(bào)告會(huì)上的講話
- 2024年XX村合作社年報(bào)總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊(cè)教研組工作總結(jié)
- 2024年小學(xué)高級(jí)教師年終工作總結(jié)匯報(bào)
- 2024-2025年秋季第一學(xué)期初中物理上冊(cè)教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語(yǔ)文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報(bào)告
- 2025年學(xué)校元旦迎新盛典活動(dòng)策劃方案
- 2024年學(xué)校周邊安全隱患自查報(bào)告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報(bào)告