Windows网络编程阻塞式迭代模式和并发模式_第1页
Windows网络编程阻塞式迭代模式和并发模式_第2页
Windows网络编程阻塞式迭代模式和并发模式_第3页
Windows网络编程阻塞式迭代模式和并发模式_第4页
Windows网络编程阻塞式迭代模式和并发模式_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论