网络编程5-多线程服务器.ppt
多线程服务器,大纲,多线程服务器模型多线程例程代码讲解作业讲解,循环服务器:UDP服务器,UDP循环服务器的实现非常简单:UDP服务器每次从套接字上读取一个客户端的请求,处理,然后将结果返回给客户机.,算法,socket(.);bind(.);while(1)recvfrom(.);process(.);sendto(.);,因为UDP是非面向连接的,没有一个客户端可以一直占住服务端.只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够满足.,循环服务器:TCP服务器,TCP循环服务器的实现也不难:TCP服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接.,算法,socket(.);bind(.);listen(.);while(1)accept(.);while(1)read(.);process(.);write(.);closesocket(.);,UDP和TCP循环式服务器对比,socket(.);bind(.);while(1)recvfrom(.);process(.);sendto(.);,socket(.);bind(.);listen(.);while(1)accept(.);while(1)read(.);process(.);write(.);closesocket(.);,TCP循环服务器一次只能处理一个客户端的请求.只有在这个客户的所有请求都满足后,服务器才可以继续后面的请求.这样如果有一个客户端占住服务器不放时,其它的客户机都不能工作了.因此,TCP服务器一般很少用简单的循环服务器模型。,为了弥补循环TCP服务器的缺陷,人们提出了多路复用和并发服务器的模型.,并发服务器:多路复用I/O,初始化(socket,bind,listen);while(1)设置要监听读写文件描述符(FD_*);调用select;if(监听套接字就绪)/说明一个新的连接请求建立建立连接(accept);加入到监听文件描述符中去;else/有已经连接过的文件描述符有数据响应 对相应的文件描述符进行操作(read或者write);,多路复用I/O可以解决资源限制的问题.该模型实际上是将UDP循环模型用在了TCP上面.由于服务器依次处理客户的请求,所以可能会导致有的客户会等待很久.,并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是服务器创建一个子线程来处理.,算法(监听线程),socket(.);bind(.);listen(.);while(1)accept(.);_beginthread(workthread,);,算法(工作子线程),workthread()while(1)read(.);process(.);write(.);closesocket(.);,CreateThread,HANDLE WINAPI CreateThread(_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,_In_ SIZE_T dwStackSize,_In_ LPTHREAD_START_ROUTINE lpStartAddress,_In_opt_ LPVOID lpParameter,_In_ DWORD dwCreationFlags,_Out_opt_ LPDWORD lpThreadId);,beginthread,uintptr_t _beginthread(/NATIVE CODEvoid(_cdecl*start_address)(void*),unsigned stack_size,void*arglist);,beginthreadex,uintptr_t _beginthreadex(/NATIVE CODEvoid*security,unsigned stack_size,unsigned(_stdcall*start_address)(void*),void*arglist,unsigned initflag,unsigned*thrdaddr);,TCP并发服务器可以解决TCP循环服务器客户机独占服务器的情况.不过也同时带来了一个不小的问题.为了响应客户机的请求,服务器要创建子进程来处理.而创建子进程是一种非常消耗资源的操作。,好的解决方法,多种技术混用如多线程+多路复用+非阻塞具体选择何种技术,根据系统需求和安全需要而定,