




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Windows网络编程阻塞式迭代模式和并发模式区别:阻塞式迭代模式:每次只服务一个连接,只有在服务完当前服务器连接之后,才会继续服务下一个客户端连接阻塞式并发连接模式:通过多线程,可以同时服务多个连接,每一个线程处理一个客户端连接步骤:阻塞式迭代模式步骤:1,先连接处理,绑定本地地址和监听接受一个客户端连接并返回对应的连接的套接字处理一个客户端的连接,实现接受和发送数据4,关闭一个服务5,服务器主体阻塞式并发模式:和迭代模式基本相同,只是在于处理客户端连接上,我们需要用到多线程来处理客户端连接,以给予服务端同时处理业务的能力多线程函数:HANDLECreateThread(LPSECURITY
2、_ATTRIBUTESIpThreadAttributes,/pointertosecurityattributesDWORDdwStackSize,/initialthreadstacksizeLPTHREAD_START_ROUTINEIpStartAddress,/pointertothreadfunctionLPVOIDIpParameter,/argumentfornewthreadDWORDdwCreationFlags,/creationflagsLPDWORDIpThreadId/pointertoreceivethreadID);第一个参数是指向SECURITY_ATTRIB
3、UTES型态的结构的指针。一般取值0第二个参数是用于新线程的初始堆栈大小,默认值为0。在任何情况下,Windows根据需要动态延长堆栈的大小。第三个参数是指向线程函数的指标。函数名称没有限制,但是必须以下列形式声明:DWORDWINAPIThreadProc(PVOIDpParam);第四个参数为传递给ThreadProc的参数。这样主线程和从属线程就可以共享数据。第五个参数通常为0,但当建立的线程不马上执行时为旗标CREATE_SUSPENDED。线程将暂停直到呼叫ResumeThread来恢复线程的执行为止。第六个参数是一个指标,指向接受执行绪ID值的变量。代码:迭代模型代码:/阻塞式迭代
4、模型.cpp:定义控制台应用程序的入口点。#includestdafx.h#include#include#pragmacomment(lib,ws2_32.lib)usingnamespacestd;#definenSERPort8000#definenBufMaxSize1024/封装的打印voiddebugLog(char*logStr)coutlogStrWSAGetLastError()WSAStartuperror);returnFALSE;/先创建套接字绑定本地地址然后开始监听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;/接受一个客户端连接并返回对应的连接的套接字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网络编程阻塞式迭代模式和并发模式处理一个客户端的连接,实现接受和发送数据BOOLClientConFun(SOCKETsd)charBufnBufMaxSize;intnRetByte;/循环处理数据do接受到来自客户端的数据nRetByte=recv(sd,Buf,nBufMa
8、xSize,0);if(nRetByte=SOCKET_ERROR)debugLog(ClientConFun-recverror!);returnFALSE;elseif(nRetByte!=0)BufnRetByte=0;cout接收到一条数据: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网络编程阻塞式迭代模式和并发模式/关闭一个连接BOOLCloseConnect(SOCKETsd)/首先发送一个TCPFIN分段,向对方表明已经完成数据发送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错误的接收数据);break;while(nRetByte!=0);if(closesocket(sd)=SOCKET_ERROR)debugLog(CloseConnect-closeSocketerror);returnFALSE;returnTRUE;/服务器主体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网络编程阻塞式迭代模式和并发模式/客户端处理if(ClientConFun(sd)=FALSE)/break;关闭一个客户端的连接if(CloseConnect(sd)=FALSE)break;if(closesocket(hSocket)=SOCKET_ERROR)debugLog(MyTcpSerF
12、un-closesocketerror);return;int_tmain(intargc,_TCHAR*argv)/初始化InitSocket();/业务数据处理MyTcpSerFun();/释放WinSocketWSACleanup();system(pause);return0;并发模型代码:/阻塞式并发模型.cpp:定义控制台应用程序的入口点。#includestdafx.h#include#include#pragmacomment(lib,ws2_32.lib)usingnamespacestd;#definenSERPort8000#definenBufMaxSize1024/封
13、装的打印voiddebugLog(char*logStr)coutlogStrWSAGetLastError()WSAStartuperror);returnFALSE;/先创建套接字绑定本地地址然后开始监听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;接受一个客户端连接并返回对应的连接的套接字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;处理一个客户端的连接,实现接受和发送数据BOOLClientConFun(SOCKETsd)charBufnBufMaxSize;intnRetByte;/循环处理数据do接受到来自客户端的数据nRetByte=recv(sd,Buf,nBufMaxSize,0);if(nRetByte=SOCKET_ERROR)debugLog(ClientConFun-recverror!);returnFALSE;elseif(nRetByte!=0)BufnRetByte=0;cout接收到一条数据: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;关闭一个连接BOOLCloseConnect(SOCKETsd)首先发送一个TCPFIN分段,向对方表明已经完成数据发送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错误的接收数据);break;while(nRetByte!=0);if(closesocket(sd)=SOCKET_ERROR)debugLog(CloseConnect-closeSocketerror);returnFALSE;returnTRUE;/线程处理业务DWORDWINAPIClientThreadFun(LPVOIDlpParam)SOCKETsd=(SOCKET)lpParam;/客户端处理if(ClientConFun(sd)=FALSE)/break;/关闭一个客户端的连接if(CloseConnect(sd)=FALSE)/break;return0;/服务器主体voidMyTcpSerFun()SOCKEThSocket=Bind_Listen(1);if(hSoc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自卸汽车运碎石土施工方案
- 2025年金属复合材项目发展计划
- 黑龙江水下封堵施工方案
- 水泥屋顶光伏施工方案
- 河北立体绿化施工方案
- 数控加工工艺与编程技术基础 教案 模块三 项目三 自动编程(1-2)
- 2025年山东省聊城市高三下学期一模生物试题(原卷版+解析版)
- 智研咨询发布:2025年中国制氢催化电极行业市场全景调查及投资前景预测报告
- 【市占率证明权威指南】制药装备行业市占率全解(智研咨询发布)
- 低碳技术的研发与应用策略
- 财务管理(山东联盟-青岛科技大学)知到智慧树章节测试课后答案2024年秋青岛科技大学
- 2024初中语文新教材培训:阅读综合实践栏目的设计与使用解读
- 《高压直流输电换流阀用金属管状电阻器技术规范(征求意见稿)》
- GJB9001C-2017版标准培训课件
- 天津市南开区2025届高三下学期一模考试英语试题含解析
- 【大学】电子陶瓷材料
- 公益服务调研报告范文
- 电影配乐合同模板
- 2024年铜陵职业技术学院单招职业适应性测试题库完美版
- 《科学计算语言Julia及MWORKS实践》全套教学课件
- 【MOOC】断层影像解剖学-山东大学 中国大学慕课MOOC答案
评论
0/150
提交评论