Socket高效网络服务端研究

上传人:飞*** 文档编号:43007086 上传时间:2018-06-04 格式:DOC 页数:6 大小:939.57KB
返回 下载 相关 举报
Socket高效网络服务端研究_第1页
第1页 / 共6页
Socket高效网络服务端研究_第2页
第2页 / 共6页
Socket高效网络服务端研究_第3页
第3页 / 共6页
Socket高效网络服务端研究_第4页
第4页 / 共6页
Socket高效网络服务端研究_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《Socket高效网络服务端研究》由会员分享,可在线阅读,更多相关《Socket高效网络服务端研究(6页珍藏版)》请在金锄头文库上搜索。

1、图 1 C/S 通信模型2012-07-13#2012-07-13# 2# 012-07-13#黄金雪(华南师范大学增城学院计算机系, 广州 511363)摘要: 通 过 对 TCP/IP 协 议 下 的 Socket编 程 框 架 的 研 究 和 实 现 进 行 分 析 , 提 出 基 于 Socket编 程 框 架 的 改 进 型 分 层 异 步 服 务 端 架 构 ,并 在 Linux 系 统 下 实 现 改 进 后 的 服 务 端 系 统 框 架 。 通 过 实 验 验 证 ,优 化 的 分 层 异 步 服 务 端 架 构 ,相 对 经 典 服 务 器 端 架 构 有 很 大 的 性

2、能 提 升 ,可 以 为 多 客 户 端 应 用 提 供 易 用 、高 效 、高 性 能 的 网 络 服 务 。关键词: Socket; 网 络 服 务 ; 分 层 异 步引 言(1)Socket 简介简单来讲 Socket 可以被描述为两个应用通信通道 的端点。 每个 Socket 端点可以用 Socket 地址来描述。Socket 地址结构由 IP 地址、Port 端口以及相关使 用协议组成 TCP 或者 UDP 协议。(2)C/S 模型C/S 网络通信模型是使用最广最为基础的通信模 型, 通过 C/S 通信模型可以较全面地了解到 Socket 编 程的精髓,简单的 C/S 模型如图 1

3、所示。链接成功后进行数据交互, 结束操作后关闭所建立的 Socket 链接。服务端主要完成:Socket 链接建立,绑定服务器端 口,监听网络链接,接收到客户端链接后,进行数据交互,结束操作后关闭所建立的 Socket 链接。0通过 C/S 通信模型,完成同服务器端的交互。客户端应用系统可以方便地Socket 网络服务端编写1通过最常用的 C/S 模型,可以看到服务端在建立监听后,需要不断的接收客户端的请求,并进行相应的数据交互, 下面我们重点探讨如何实现 Socket 网络服 务端的函数。正确理解 Socket 所使用到的函数, 是进行 Socket编程的第一步。 在建立 Socket 链接

4、后一定要对 Socket链接进行相应的关闭。 笔者就曾遇到由于在某种异常 条件下 Socket 服务端程序跳出而没有进行关闭链接的情况,造成大量未释放 Socket 链接堵塞整个网络应用的 情况。 因此对于使用 Socket 进行编程,除了了解上述的 应用函数外更重要的是理解,这样在实际进行网络编程 时才不会因为一时的疏忽造成重大的缺陷。Socket 经典服务端在了解 Socket 服务端流程及需要使用的相关函数2客户端主要完成:Socket 链接建立,链接服务器,后 ,可以编写出比较经典 Socket 服 务 端 应 用 ,经 典 2012-收0稿7日 期-:120311#-0#4-#15#

5、修#稿#日#期 #:20#11#-0#5-#15#2012-07-13# 2# 012-07-13#图 2 经典 Socket 服务端图 3 派生子进程的服务器Socket 服务端流程如图 2 所示。派生出的子进程在完成同客户端的请求交互后, 自动结束并释放相应的资源。 通过使用派生子进程这 样的优化操作,极大增强了服务端应用的处理能力,服 务器端应用的框架结果发生如下变化,如图 3。通过对这段经典的服务器端流程的理解,可以看到网络服务进程通过调用建立套接字,绑定指定的网络端口,然后对网络端口进行监听,等待接收客户端请 求,如没有接收到客户端的请求,则服务器端应用进行阻塞等待,直到接收到请求链

6、接后同客户端应用进行/* 建立服务端连接并侦听客户端 */sockid=Socket(AF_INET,SOCK_STREAM,0); /* 绑定 Socket*/bind(sockid,(struct sockaddr*) ; ) /* 接收 Socket连接 */相关数据交互。 处理完成数据交互后关闭相应套接字。经典服务端存在的问题经 典 的服务端代码完整展示了Socket 服 务 的 过 程。 但经典的服务器端代码只能存在于教科书,对于实3际进行 Socket 编写服务端应用的来说,本无法满足要求。上述的代码根没有一个服务端的应用只可以处理到一个客户端 的请求, 服务端需要的是对大量客户端

7、的请求可以同 时进行处理、 响应。 满足大量交易量情况下的处理要 求,为完成一个高效的服务端应用,就一定要对服务端 代码进行优化。 要解决的最重要问题是对大量客户端请求的 接 收。 经典的服务器代码只可以处理一个客户端请求,我ilSockfd = accept (igSocket ,if (! fork()) /* 子进程代码段 */ send(client_fd) close(client_fd);close(client_fd);(struct sockaddr*)们需要对接收能力进行扩展。可以是服务器端的应用同时对多个客户端进行响应,并同客户端进行交互。Socket 服务优化为提升服务端

8、处理效率,处理多个客户端请求,以 及进行大批量数据交互, 需要对服务器端的接收能力 进行扩展。 通过对服务器端应用增加进程来扩展接收及处理4 通过对服务端进行优化, 上述代码可以同时处理到多个客户端的请求,可以应付多个客户端同时要求进行交互的情况。对于每一个客户端的请求都分派一个新的子进程进行处理。 子进程处理完成后释放自己 的资源,看起来这个扩展很完美,是否真正可以应用到 实际的服务端应用? 事实看来并非如此简单。能力,服务器接收到的客户端的请求报文立即派生一个子进程对客户端请求进行处理。 同时服务端可以马 上接收下一笔请求报文, 收到后再次派生新的子进程 对请求进行处理。优化后分析通过不断

9、地派生新的子进程处理大量客户端同时5图 4 高效 Socket 服务端访问,进行数据交互的情况,暂时缓解了服务器端的请 求压力。 但是当每一个子进程在同客户端进行大量数据交/* 创建客户线程处理回送客户端报文 */pthread_create( /* 创建服务线程处理客户端请求报文 */ pthread_create( /* 服务 器 端服 务 应 用, 主 要 完 成对 客 户 端请 求 接 收 , 将 不 同 客户 端 发 起的 交 易 请求 发 送 到服 务 端 统一 进 行 处 理 的 服 务 器消息队列中进行异步处理。 */void * serverproc(void *Conn)

10、for(;) /* 接收 Socket 连接 */newsock=accept(igSocket,(struct sockaddr *)ilMsglen = TcpRcv(newsock,alMsgbuf,sizeof(alMsgbuf); /* 发送报文到消息队列 */ msgsnd(q_reqid, /* 服务 器 端客 户 应 用, 主 要 完 成对 客 户 端请 求 响 应 , 从 服 务 器端统一的消息队列中提取客户端的请求响应 ,通过异步方 式不断回送给客户端。 */void *client_proc(void *args) for( ; ; ) /* 读回送消息队列 */msgr

11、cv (qid, (char *) ilRn = TcpSnd(sockfd, alMsgbuf, ilMsglen); 互时,特别是在子进程对数据进行交互过程如出现异常,子进程处理缓慢的情况下,子进程所占用的系统资 源不会很快地进行释放,不断的客户端请求,会使得派生的子进程影响到系统级的处理效率。 还有可能造成服务器宕机。严重的情况下由此看来此端的代码也不能用于实际的服务端应 用。 实际使用的服务端应用不仅可以处理大量客户端 的交互,而且在异常情况下不会引起服务端的不稳定。 更重要的是可以不断地扩充自身的服务能力来使同客 户端的响应更加的快捷。 为了达到这个终极的处理目 标,对服务端还需要进

12、行以下的进一步优化。Socket 再次优化为向客户端提供一个高效、可靠服务系统,网络服 务端应用不但要处理大量的客户请求,提供快速响应,6而且还需要在相关系统后台不稳定的情况下,还可以提供有效的网络服务。这就要求服务端应用不单单是完成一个处理进程的扩展,而且还要相当强大的容错, 以及快速应用响应。 在相关后台系统处理缓慢的情况 下服务端应用仍然可以正常提供服务。为解决这些实际服务端经常遇到的情况,笔者引入分层处理的概念。 服务端的应用不再只是单独的派 生子进程对交易进行处理。 而是引入一个分层次处理的概念,每一个客户端应用对于服务器端的处理都采用异步分层的处理方式进行处理。 既提高了处理速度,

13、 又可以对处理方式根据系统资源的实际情况进程不断 地扩展。如图 4 所示,一个高效的网络服务端需要结合消息队列异步的处理方式,响应客户端的请求。 在对于每 一个客户端请求都可以通过扩展进行处理, 提高处理 效率。/* 建立服务端连接并侦听客户端 */ sockid=Socket(AF_INET,SOCK_STREAM,0); /* 绑定 Socket*/bind (sockid, (struct sockaddr_in) /* 进行侦听 */sockaddr*)&serv_addr,sizeof (struct通过新一轮的服务器端应用优化, 新的服务端不 再只是简单地派生一个子程处理单个客户端

14、的交易请求,而是使用分层处理的概念,采用异步处理模式。采listen(sockid,SOMAXCONN)用多个线程,serverproc ()主要用于接收客户端的请求信息,clientproc ()用于将服务器端的响应信息送回给 客户端。将原来需要同步等待处理的过程, 转变成为异步 分层处理的过程,使得程序效率大幅提升。程进行处理, 由于系统资源只可以同时派生 100 个子 进程因此,当同时有 100 个客户端进行响应时,服务器 端还可以进行处理,第 101 个客户请求,就需要等 100 个客户中某一个进程处理完成释放响应资源后, 方可以进行派生进程处理。 因此当同时有 10000 个客户同

15、时请求时理论的请求响应时间为 100s。分层模式:对于请求通过异步处理模式进行处理,性能分析在采用异步方式进行请求响应、 通过消息队列分 层、多进程处理的模式,服务器端的应用可以在处理响 应的高峰期, 不断启动处理进程来进行自身的服务扩7同时派生 100 个进程对消息队列进行处理。在理论优化的情况下,每一笔交易均可以快速,不受延时的进程处理。 因此对于 10000 个客户同时请求的情况下,响应 时间为 1s。通过分析,我们可以看出,在不同的服务器端处理模 式下,当客户端请求不断增多的情况下,服务器资源受到 约束, 笔者提出的分层处理模式可以更大地发挥服务端 的资源优势,更好地为客户端提供稳定、

16、高效的服务。展。使用异步处理的方式对于因后台系统造成的某一个客户端请求延迟不会影响到整个服务端的应用。通过这样的优化服务端应用基本达到了可以在实际环境 进行部署的要求。通过对服务端应用的两次优化,我们将最为经典的 Socket 网络应用从教科书式的模型,转换为实际服 结 语本文通过对经典教科书式的 Socket 服务端在实际 使用环境中出现的问题,不断地完善和优化。 通过对服 务端的深入分析, 使读者可以更加深入了解 Socket 的8务端应用可以应用的模型。通过优化可以最大效率发挥出服务端的资源优势,通过消息队列、异步处理进行相关消息传递,多进程处理,有利于释放服务器端的资 源,增强了服务端应用的健壮性。这里以每个客户端发起一笔交易请求,服务器端服务器端编程。真正的服务器端不是一种理想化的服 对此请求进行响应为例简要分析

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号