




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Windows網(wǎng)絡(luò)編程阻塞式迭代模式和并發(fā)模式區(qū)別:阻塞式迭代模式:每次只服務(wù)一個連接,只有在服務(wù)完當(dāng)前服務(wù)器連接之后,才會繼續(xù)服務(wù)下一個客戶端連接阻塞式并發(fā)連接模式:通過多線程,可以同時服務(wù)多個連接,每一個線程處理一個客戶端連接步驟:阻塞式迭代模式步驟:1,先連接處理,綁定本地地址和監(jiān)聽接受一個客戶端連接并返回對應(yīng)的連接的套接字處理一個客戶端的連接,實現(xiàn)接受和發(fā)送數(shù)據(jù)4,關(guān)閉一個服務(wù)5,服務(wù)器主體阻塞式并發(fā)模式:和迭代模式基本相同,只是在于處理客戶端連接上,我們需要用到多線程來處理客戶端連接,以給予服務(wù)端同時處理業(yè)務(wù)的能力多線程函數(shù):HANDLECreateThread(LPSECURITY
2、_ATTRIBUTESIpThreadAttributes,/pointertosecurityattributesDWORDdwStackSize,/initialthreadstacksizeLPTHREAD_START_ROUTINEIpStartAddress,/pointertothreadfunctionLPVOIDIpParameter,/argumentfornewthreadDWORDdwCreationFlags,/creationflagsLPDWORDIpThreadId/pointertoreceivethreadID);第一個參數(shù)是指向SECURITY_ATTRIB
3、UTES型態(tài)的結(jié)構(gòu)的指針。一般取值0第二個參數(shù)是用于新線程的初始堆棧大小,默認(rèn)值為0。在任何情況下,Windows根據(jù)需要動態(tài)延長堆棧的大小。第三個參數(shù)是指向線程函數(shù)的指標(biāo)。函數(shù)名稱沒有限制,但是必須以下列形式聲明:DWORDWINAPIThreadProc(PVOIDpParam);第四個參數(shù)為傳遞給ThreadProc的參數(shù)。這樣主線程和從屬線程就可以共享數(shù)據(jù)。第五個參數(shù)通常為0,但當(dāng)建立的線程不馬上執(zhí)行時為旗標(biāo)CREATE_SUSPENDED。線程將暫停直到呼叫ResumeThread來恢復(fù)線程的執(zhí)行為止。第六個參數(shù)是一個指標(biāo),指向接受執(zhí)行緒ID值的變量。代碼:迭代模型代碼:/阻塞式迭代
4、模型.cpp:定義控制臺應(yīng)用程序的入口點(diǎn)。#includestdafx.h#include#include#pragmacomment(lib,ws2_32.lib)usingnamespacestd;#definenSERPort8000#definenBufMaxSize1024/封裝的打印voiddebugLog(char*logStr)coutlogStrWSAGetLastError()WSAStartuperror);returnFALSE;/先創(chuàng)建套接字綁定本地地址然后開始監(jiān)聽SOCKETBind_Listen(intnBacklog)SOCKEThSocket=socket(A
5、F_INET,SOCK_STREAM,IPPROTO_TCP);if(hSocket=INVALID_SOCKET)debugLog(Bind_Listen-socketerror!);returnINVALID_SOCKET;sockaddr_insaSerAddr;saSerAddr.sin_family=AF_INET;saSerAddr.sin_addr.s_addr=htonl(ADDR_ANY);saSerAddr.sin_port=htons(nSERPort);if(bind(hSocket,(LPSOCKADDR)&saSerAddr,sizeof(saSerAddr)deb
6、ugLog(Bind_Listen-binderror);closesocket(hSocket);returnINVALID_SOCKET;if(listen(hSocket,nBacklog)=SOCKET_ERROR)closesocket(hSocket);debugLog(Bind_Listen-listenerror);returnINVALID_SOCKET;returnhSocket;/接受一個客戶端連接并返回對應(yīng)的連接的套接字SOCKETAcceptConnetion(SOCKEThScoket)sockaddr_insaConAddr;intnSize=sizeof(saC
7、onAddr);SOCKETsd=accept(hScoket,(LPSOCKADDR)&saConAddr,&nSize);if(sd=INVALID_SOCKET)debugLog(AcceptConnetion-connecterror);returnINVALID_SOCKET;returnsd;Windows網(wǎng)絡(luò)編程阻塞式迭代模式和并發(fā)模式處理一個客戶端的連接,實現(xiàn)接受和發(fā)送數(shù)據(jù)BOOLClientConFun(SOCKETsd)charBufnBufMaxSize;intnRetByte;/循環(huán)處理數(shù)據(jù)do接受到來自客戶端的數(shù)據(jù)nRetByte=recv(sd,Buf,nBufMa
8、xSize,0);if(nRetByte=SOCKET_ERROR)debugLog(ClientConFun-recverror!);returnFALSE;elseif(nRetByte!=0)BufnRetByte=0;cout接收到一條數(shù)據(jù):Bufendl;intnSend=0;while(nSend0)nSend+=nTemp;elseif(nTemp=SOCKET_ERROR)debugLog(ClientConFun-senderror);returnFALSE;else/send返回0由于此時sendsend-closeerror);returnFALSE;while(nRet
9、Byte!=0);returnTRUE;Windows網(wǎng)絡(luò)編程阻塞式迭代模式和并發(fā)模式/關(guān)閉一個連接BOOLCloseConnect(SOCKETsd)/首先發(fā)送一個TCPFIN分段,向?qū)Ψ奖砻饕呀?jīng)完成數(shù)據(jù)發(fā)送if(shutdown(sd,SD_SEND)=SOCKET_ERROR)debugLog(CloseConnect-shutdownerror);returnFALSE;charBufnBufMaxSize;intnRetByte;donRetByte=recv(sd,Buf,nBufMaxSize,0);if(nRetByte=SOCKET_ERROR)debugLog(CloseC
10、onnect-recverror);break;elseif(nRetByte0)debugLog(CloseConnect錯誤的接收數(shù)據(jù));break;while(nRetByte!=0);if(closesocket(sd)=SOCKET_ERROR)debugLog(CloseConnect-closeSocketerror);returnFALSE;returnTRUE;/服務(wù)器主體voidMyTcpSerFun()SOCKEThSocket=Bind_Listen(1);if(hSocket=INVALID_SOCKET)debugLog(MyTcpSocket-Bind_Liste
11、nerror);return;while(TRUE)/返回客戶端的套接字SOCKETsd=AcceptConnetion(hSocket);if(sd=INVALID_SOCKET)debugLog(MyTcpSerFun-AcceptConnectionerror);break;Windows網(wǎng)絡(luò)編程阻塞式迭代模式和并發(fā)模式/客戶端處理if(ClientConFun(sd)=FALSE)/break;關(guān)閉一個客戶端的連接if(CloseConnect(sd)=FALSE)break;if(closesocket(hSocket)=SOCKET_ERROR)debugLog(MyTcpSerF
12、un-closesocketerror);return;int_tmain(intargc,_TCHAR*argv)/初始化InitSocket();/業(yè)務(wù)數(shù)據(jù)處理MyTcpSerFun();/釋放WinSocketWSACleanup();system(pause);return0;并發(fā)模型代碼:/阻塞式并發(fā)模型.cpp:定義控制臺應(yīng)用程序的入口點(diǎn)。#includestdafx.h#include#include#pragmacomment(lib,ws2_32.lib)usingnamespacestd;#definenSERPort8000#definenBufMaxSize1024/封
13、裝的打印voiddebugLog(char*logStr)coutlogStrWSAGetLastError()WSAStartuperror);returnFALSE;/先創(chuàng)建套接字綁定本地地址然后開始監(jiān)聽SOCKETBind_Listen(intnBacklog)SOCKEThSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(hSocket=INVALID_SOCKET)debugLog(Bind_Listen-socketerror!);returnINVALID_SOCKET;sockaddr_insaSerAddr;saSerAddr
14、.sin_family=AF_INET;saSerAddr.sin_addr.s_addr=htonl(ADDR_ANY);saSerAddr.sin_port=htons(nSERPort);if(bind(hSocket,(LPSOCKADDR)&saSerAddr,sizeof(saSerAddr)debugLog(Bind_Listen-binderror);closesocket(hSocket);returnINVALID_SOCKET;if(listen(hSocket,nBacklog)=SOCKET_ERROR)closesocket(hSocket);debugLog(Bi
15、nd_Listen-listenerror);returnINVALID_SOCKET;returnhSocket;接受一個客戶端連接并返回對應(yīng)的連接的套接字SOCKETAcceptConnetion(SOCKEThScoket)sockaddr_insaConAddr;intnSize=sizeof(saConAddr);SOCKETsd=accept(hScoket,(LPSOCKADDR)&saConAddr,&nSize);if(sd=INVALID_SOCKET)debugLog(AcceptConnetion-connecterror);returnINVALID_SOCKET;r
16、eturnsd;處理一個客戶端的連接,實現(xiàn)接受和發(fā)送數(shù)據(jù)BOOLClientConFun(SOCKETsd)charBufnBufMaxSize;intnRetByte;/循環(huán)處理數(shù)據(jù)do接受到來自客戶端的數(shù)據(jù)nRetByte=recv(sd,Buf,nBufMaxSize,0);if(nRetByte=SOCKET_ERROR)debugLog(ClientConFun-recverror!);returnFALSE;elseif(nRetByte!=0)BufnRetByte=0;cout接收到一條數(shù)據(jù):Bufendl;intnSend=0;while(nSend0)nSend+=nTem
17、p;elseif(nTemp=SOCKET_ERROR)debugLog(ClientConFun-senderror);returnFALSE;else/send返回0由于此時sendsend-closeerror);returnFALSE;while(nRetByte!=0);returnTRUE;關(guān)閉一個連接BOOLCloseConnect(SOCKETsd)首先發(fā)送一個TCPFIN分段,向?qū)Ψ奖砻饕呀?jīng)完成數(shù)據(jù)發(fā)送if(shutdown(sd,SD_SEND)=SOCKET_ERROR)debugLog(CloseConnect-shutdownerror);returnFALSE;ch
18、arBufnBufMaxSize;intnRetByte;donRetByte=recv(sd,Buf,nBufMaxSize,0);if(nRetByte=SOCKET_ERROR)debugLog(CloseConnect-recverror);break;elseif(nRetByte0)debugLog(CloseConnect錯誤的接收數(shù)據(jù));break;while(nRetByte!=0);if(closesocket(sd)=SOCKET_ERROR)debugLog(CloseConnect-closeSocketerror);returnFALSE;returnTRUE;/線程處理業(yè)務(wù)DWORDWINAPIClientThreadFun(LPVOIDlpParam)SOCKETsd=(SOCKET)lpParam;/客戶端處理if(ClientConFun(sd)=FALSE)/break;/關(guān)閉一個客戶端的連接if(CloseConnect(sd)=FALSE)/break;return0;/服務(wù)器主體voidMyTcpSerFun()SOCKEThSocket=Bind_Listen(1);if(hSoc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 買房有物業(yè)合同范本
- bt合同ppp合同范本
- 企業(yè)人事聘用合同范本
- 出租保安服裝合同范本
- 單位購儀器合同范本
- 先打款后開票合同范本
- 協(xié)議付款合同范例
- 上門宴席服務(wù)合同范本
- 東莞企業(yè)勞務(wù)合同范本
- 兒童游泳班合同范本
- 2025年企業(yè)法務(wù)顧問聘用協(xié)議范本
- 教育部人文社科 申請書
- 無菌手術(shù)臺鋪置的細(xì)節(jié)管理
- 《康復(fù)評定技術(shù)》課件-第五章 運(yùn)動控制
- 議論文8(試題+審題+范文+點(diǎn)評+素材)-2025年高考語文寫作復(fù)習(xí)
- 【理特咨詢】2024生成式人工智能GenAI在生物醫(yī)藥大健康行業(yè)應(yīng)用進(jìn)展報告
- 2025新人教版英語七年級下單詞默寫表(小學(xué)部分)
- 2025年春新外研版(三起)英語三年級下冊課件 Unit6第1課時Startup
- 2025江蘇蘇州高新區(qū)獅山商務(wù)創(chuàng)新區(qū)下屬國企業(yè)招聘9人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《蒙牛集團(tuán)實施財務(wù)共享過程中存在的問題及優(yōu)化建議探析》8800字(論文)
- 平拋運(yùn)動的經(jīng)典例題
評論
0/150
提交評論