深入 csocket 编程之阻塞与非阻塞模式

深入 csocket 编程之阻塞与非阻塞模式

ID:20574812

大小:46.00 KB

页数:5页

时间:2018-10-13

深入 csocket 编程之阻塞与非阻塞模式_第1页
深入 csocket 编程之阻塞与非阻塞模式_第2页
深入 csocket 编程之阻塞与非阻塞模式_第3页
深入 csocket 编程之阻塞与非阻塞模式_第4页
深入 csocket 编程之阻塞与非阻塞模式_第5页
资源描述:

《深入 csocket 编程之阻塞与非阻塞模式》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、深入CSocket编程之阻塞和非阻塞模式2007年09月30日星期日19:25有时,花上几个小时阅读、调试、跟踪优秀的源码程序,能够更快地掌握某些技术关键点和精髓。当然,前提是对这些技术大致上有一个了解。  我通过几个采用CSocket类编写并基于Client/Server(客户端/服务端)的网络聊天和传输文件的程序(详见:源代码参考),在调试这些程序的过程中,追踪深入至CSocket类核心源码Sockcore.cpp,对于CSocket类的运行机制可谓是一览无遗,并且对于阻塞和非阻塞方式下的socket程序的编写也是稍有体会。阅读本文请先注意

2、:  这里的阻塞和非阻塞的概念仅适用于Server端socket程序。socket意为套接字,它与Socket不同,请注意首字母的大小写。  客户端与服务端的通信简单来讲:服务端socket负责监听,应答,接收和发送消息,而客户端socket只是连接,应答,接收,发送消息。此外,如果你对于采用CSocket类编写Client/Server网络程序的原理不是很了解,请先查询一下(详见:参考书籍和在线帮助)。在此之前,有必要先讲述一下:网络传输服务提供者,ws2_32.dll,socket事件和socketwindow。1、网络传输服务提供者(网络

3、传输服务进程),Socket事件,SocketWindow  网络传输服务提供者(transportserviceprovider)是以DLL的形式存在的,在windows操作系统启动时由服务进程svchost.exe加载。当socket被创建时,调用API函数Socket(在ws2_32.dll中),Socket函数会传递三个参数:地址族,套接字类型(注2)和协议,这三个参数决定了是由哪一个类型的网络传输服务提供者来启动网络传输服务功能。所有的网络通信正是由网络传输服务提供者完成,这里将网络传输服务提供者称为网络传输服务进程更有助于理解,因为

4、前文已提到网络传输服务提供者是由svchost.exe服务进程所加载的。  下图描述了网络应用程序、CSocket(WSock32.dll)、SocketAPI(ws2_32.dll)和网络传输服务进程之间的接口层次关系:当Client端socket与Server端socket相互通信时,两端均会触发socket事件。这里仅简要说明两个socket事件:·FD_CONNECT:连接事件,通常Client端socket调用socketAPI函数Connect时所触发,这个事件发生在Client端。·FD_ACCEPT:正在引入的连接事件,通常Se

5、rver端socket正在接收来自Client端socket连接时触发,这个事件发生在Server端。  网络传输服务进程将socket事件保存至socket的事件队列中。此外,网络传输服务进程还会向socketwindow发送消息WM_SOCKET_NOTIFY,通知有socket事件产生,见下文对socketwindow的详细说明。  调用CSocket::Create函数后,socket被创建。socket创建过程中调用CAsyncSocket::AttachHandle(SOCKEThSocket,CAsyncSocket*pSocke

6、t,BOOLbDead)。该函数的作用是:·将socket实例句柄和socket指针添加至当前模块状态(注1)的一个映射表变量m_pmapSocketHandle中。·在AttachHandle过程中,会new一个CSocketWnd实例(基于CWnd派生),这里将这个实例称之为socketwindow,进一步理解为它是存放所有sockets的消息池(window消息),请仔细查看,这里socket后多加了一个s,表示创建的多个socket将共享一个消息池。·当Client端socket与Server端相互通信时,此时网络传输服务进程向sock

7、etwindow发送消息WM_SOCKET_NOTIFY,需要说明的是CSocketWnd窗口句柄保存在当前模块状态的m_hSocketWindow变量中。2、阻塞模式  阻塞模式下Server端与Client端之间的通信处于同步状态下。在Server端直接实例化CSocket类,调用Create方法创建socket,然后调用方法Listen开始侦听,最后用一个while循环阻塞调用Accept函数用于等待来自Client端的连接,如果这个socket在主线程(主程序)中运行,这将导致主线程的阻塞。因此,需要创建一个新的线程以运行socket服

8、务。调试跟踪至CSocket::Accept函数源码:while(!Accept(...)){     //Thesocketismarkedasno

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。