基于对等模式的Socket网络通信
本文关键词:基于对等模式的Socket网络通信,由笔耕文化传播整理发布。
基于对等模式的Socket网络通信
No. 5 Oct , 2008 .
微 处 理 机
M ICROPROCESSORS
第 5期 2008 年 10 月
基于对等模式的 Socket网络通信
刘 ,钟子发 松
(解放军电子工程学院 ,合肥 230037 )
: 传统的 C lient - Server模式中 Socket网络通信的客户端之间不能直接通信 , 不适应各 摘 要 主机需要直接通信的应用 。改进后的 C lient - Server模式 ,实现了各主机直接的对等模式 Socket网 络通信 ,并采用先检测后连接的方式 ,解决了通信对方未开机时连接时间较长的问题 。 关键词 : 套接字 ; 对等模式 ; 网络通信 ; 微软 VC ++ 6. 0 中图分类号 : TP331 文献标识码 : B 文章编号 : 1002 - 2279 ( 2008 ) 05 - 0046 - 02
The Net work Comm un ica tion of Socket Ba sed on Peer - to - Peer M odel
L I Song, ZHONG Zi - fa U
( E lectron ic Eng ineering Institu te of PLA, Hefei 230037, Ch ina )
Abstract: In the conventional Net communication of Socket w ith Client - Server model, a C lient is inadap table to directly communicate w ith others, this paper p roposed a method to im p rove the C lient Server model and realize the Peer - to - Peer model of Socket Communication. B y the mean that detect before link, the p roblem which a host computer takes a long tim e to link the closed computer is solved. Key words: Socket; Peer - to - Peer model; Net communication; M icrosoft VC ++ 6. 0
1 概 述
Socket (套接字 ) 是建立在传输层协议 (主要是 TCP和 UDP )上的一种套接字规范 。套接字屏蔽了
信相对于 Client - Server模式的 Socket网络通信不 需要一台 Server来转发各 Client之间的通信信息 。 因此 ,常用的基于 Client - Server模式的 Socket网络 通信不适合这种应用 , 需要改造为基于对等模式的 Socket网络通信 。
底层通信软件和具体操作系统的差异 , 使得任何两 台安装了 TCP (传输控制 ) 协议或 UDP (用户数据 报 )协议软件并实现了套接字规范的计算机之间的 通信成为可能 。 Socket具有信息收发速度快 、 保密 性好 、 占用服务器吞吐能力少 、 易于编程实现等优 点 。 Socket接 口包 含 Server Socket (服 务 器 端 ) 和 C lient Socket (客户端 )两个组件 。 C lient Socket组件 为客户端组件 ,它是通信的请求方 ,它主动与服务器 端建立连接 。 Server Socket 组件为服务器端组件 , 它是通信的响应方 , 它监听以及被动接受客户端的 连接请求 ,并对请求进行回复 。常用的 Socket网络 通信一般采用 C lient - Server模式 ,各客户端都和服 务器端连接 。此通信模式结构简单 、 编程易实现 ,但 各客户端之间不能直接通信 ,需通过服务器端转发 。 在电磁信号侦察系统中常有多个嵌入式系统主 机 ,且各主机之间不存在 C lient - Server关系 , 各自 独立工作 ,各主机之间都可直接进行通信 。因此 ,产 生了对等模式的网络通信需求 。对等模式的网络通
2 对等模式设计
对等结构的设计是基于对 Client - Server模式 的改进 。改进方式是将所有主机都设计成客户端和 服务器端 ,即各主机既设计服务器端程序 ,也设计客 户端程序 。本机不论以服务器端或客户端和其它主 机连接成功后都产生一个 CSocket类指针 , 利用该 指针即可和对方主机通信 。原理如图 1 所示 。
图 1 对等模式原理图
以一四主机系统为例 : 各主机的通信程序定义 三 个 CSocket类 指针分别对应于其它三台主 机的
作者简介 : 刘松 ( 1973 - ) ,男 ,江西人 ,硕士研究生 ,工程师 ,主研方向 : 通信对抗技术 。 收稿日期 : 2007 - 01 - 19
5 期
刘 松等 : 基于对等模式的 Socket网络通信
?47?
Socket连接 。一台主机既有服务器端程序又有客户
端程序则会有两种情况出现 : 1 )如本机作为服务器端被其它主机连接 , 则通 过 Accep t函数对 CSocket类指针赋值 , 同时可获得 对方的 IP (网际协议 ) 地址并标识该指针 。要给对 方发送数据则用相应指针调用 Send 函数即可 。接 收到其它主机的数据时可通过调用 : GetPeerName ( SocketA ddress, SocketPort) [ 3 ] 函数来获取发送方的 IP地址 ,根据 IP 来区分发送数据的主机 。 2 )如本机需要发送数据给其它主机但尚未建 立连接 ,则调用客户端程序 。通过使用 CSocket 类 [3] 指针调用 Connect ( IPAddress, SocketPort) 函数来 连接对方主机 。连接成功后标识该指针 , 凡是给指 定的主 机 发 送 数 据 则 使 用 相 应 标 识 的 指 针 调 用 Send ( ) 函数发送数据 。接收数据方式同服务器端 相同 。
较小的固定长度缓冲区的数据传输 , 而且不能使用 [3] CA rchive 类对象来存储接收 、 发送的数据 。因此 , 使用流式套接字来实现数据传输 。 服务器通信程序的开发过程如下 : ① 创建套接 字 ,调用 Create ( )函数 ; ② 监听创建的套接字端口并 准备接受连接请求 ,调用 L isten ( ) 函数 ; ③ 接受连接 请求 ,调用 Accep t ( )函数建立连接 ; ④ 发送数据 , 调 用 Send ( )函数实现 ; ⑤ 接收数据 ,调用 Receive ( ) 函 数实现 ; ⑥ 关闭套接字 , 调用 Close ( ) 函数实现 。详 [2 - 3] 见参考文献 。 客户端通信程序开发过程如下 : ① 创建套接字 , ( ) 函数 ; ② 调用 C reate 连接服务器端 , 调用 Connect ( )函数实现 ; ③发送数据 , 调用 Send ( ) 函数实现 ; ④ 接收数据 ,调用 Receive ( ) 函数实现 ; ⑤ 关闭套接 [2 - 3] 字 ,调用 Close ( )函数实现 。详见参考文献 。
3. 1. 3 数据接收处理
3 程序设计
3. 1 Socket通信程序开发 VC ++ 6. 0 的 M FC (微 软 基 础 类 ) 封 装 了 的 CSocket类提供了高级的 Socket支持 ,为编写网络环
数据接收函数将接收到的数据保存在函数指定 的缓冲区中 , 程序可直接从缓冲区中读取 。另外 , [3] M FC 提供了 CSocketFile 类 专用于保存 Socket接 收到的数据 。以下分别介绍这两种接收方式 : ( 1 )采用 CSocketFile 类接收 , 采用这种方式需 定义一 CSocketFile 类对象和两个 CA rchive 类对 象 ,一个用于接收 、 另一个用于发送 。代码如下 : m _pFile = new CSocketFile ( this) ; m _pA rchive In = CA rchive ( m _pFile, CA rchive: : ); load m _pA rchiveOut = CA rchive ( m _pFile, CA rchive: : store ) ; 接收数据时采用 Serialize ( 3 m _pA rchive In ) ; 函 数接收数据 ,详见参考文献 4。 ( 2 )直接从接收缓冲区中读取 , 采用这种方式
3. 2 检测程序设计
[3]
境下基于 W indow s平台的 C lient - Server结构的网 络 通 信 程 序 提 供 了 极 大 方 便 。只 要 利 用 好 [3] VC ++ 6. 0中的 CSocket 类 , 就能很方便快速地写 出高质量的网络通信软件 。
3. 1. 1 CSocket初始化 VC ++ 6. 0 的应用程序生成向导中 : 在对话框程 序向导 的 第 二 步 或 文 档 类 程 序 向 导 的 第 四 步 的 W indow s Socket选项选中即可自动加载 Socket初始 化代码 。如已生成应用程序框架可以手动加入 , 分
为两 步 : ①在 stdafx h 文 件 中 加 入 : # include . < afxsock. h > ; ② 在应用类初始化函数中加入 : if ( ! AfxSocketInit ( ) { Afx essageBox ( I P _ M D
SOCKETS_ I IT _ FA I ED ) ; return FALSE; }即可 对 N L Socket进行初始化 。 3. 1. 2 CSocket编程 CSocket编程均采用 Client - Server模式 , C lient - Server模式在操作过程中采取的是主动请求方
接收数据必须注意 : 对方发送的一帧数据可能被打 断分为两帧或多帧传送 。因此 , 接收到对方的数据 时 ,应建立一大于数据帧长的 F IFO (先进现出 )缓冲 区 ,确保接收到完整数据帧再进行处理 。 在实际应用中发现该通信程序在连接未开机的 对方主机时耗时较长 , 影响了系统进程 。耗时较长 的原因是 TCP协议特性所致 , 无法通过程序改进只 能避免连接未开机主机 。因此 , 有必要检测需连接 的对方主机是否开机 ,如对方已开机则连接 ,否则不 连接 。鉴于 W indow s自带的 Ping. exe 程序执行时 , 对方如果已开机则能快速的收到回送数据 , 未开机 也能在较短时间内回送无应答消息 。 (下转第 50 页 )
式 。首先服务器方要启动 , 并根据请求提供相应服 务 ; 客户端主动请求连接到服务器端的相应端口 。 详见参 考 文 献 。套 接 字 创 建 时 可 选 择 SOCK _ STREAM (流式套接字 )或 SOCK_DGRAM (报文式套 接字 ) ,流式套接字使用 TCP 协议需建立连接 ,它提 供顺序的 、 可靠的 、 全双工的数据传输 。报文式套接 字使用 UDP协议无需建立连接 , 它提供不可靠的 、
[1]
?50?
微 处 理 机
2008 年
利用无线传感器网络的关键 。一个良好的算法应该 满足节省能量消耗 ,延长整个网络的生存时间 ; 减少 节点间的通信干扰 ,提高网络的通信效率 ; 弥补节点 失效的影响等各方面要求 。 对于软件算法的研究 ,目前主要集中于路由 、 定 位和覆盖 三个方面 。路由协议负责将数据分组 从源节点通过网络转发到目的节点 , 它主要包括两 个方面的功能 : 寻找源节点和目的节点间的优化路 径 ,将数据分组沿着优化路径正确转发 。与传统网 络的路由协议相比 , 无线传感器网络的路由协议具 有以下特点 : 能量优先 、 基于局部拓扑信息 、 以数据 为中心 、 应用相关 。针对传感器网络路由机制的上 述特点 ,在根据具体应用设计路由机制时 ,要使传感 器网络路由协议满足能量高效 、 可以扩展 、 鲁棒性能 好和可以快速收敛的特点 。 传感器节点自身定位就是根据少数已知位置的 节点 ,按照某种定位机制确定自身的位置 。 [6] 无线传感器网络的覆盖 问题 , 可以看作是在 传感器网络节点能量 、 无线网络通信带宽 、 网络计算 能力等资源普遍受限的情况下 , 通过网络传感器节 点放置以及路由选择等手段 , 最终使无线传感器网 络的各种资源得到优化分配 , 进而使得感知 、 监视 、 传感 、 通信等各种服务质量得到改善 。
(上接第 47 页 )
[5]
5 束 语 结
无线传感器网络的应用前景十分诱人 。传统应 用有军事 、 监控 、 应急 、 环境 、 防空等领域 , 新兴应用 将涉及家用 、 企业管理 、 保健 、 交通等领域 。可以预 计 ,将来无线传感器网络将无处不在 。W SN 的终端 要达到希望的要求还会有很长一段发展历程 , 可以 由易到难 , 利 用 现 有 通 信 技 术 和 系 统 (如 无 线 市 话 ) ,逐步演进升级 。无线传感器网络的业务和应 用也需要不断开发 ,形成新兴的应用领域 。
参考文献 : [1] 任丰原 , 黄海宁 , 林闯 . 无线传感器网络 [ J ]. 软件学 报 , 2003, 14 ( 7 ) : 1282 - 1291. [2] 李建中 ,李金宝 ,石胜飞 . 传感器网络及其数据管理的 概念 、 题 与 进 展 [ J ]. 软 件 学 报 , 2003, 14 ( 10 ) : 问 1717 - 1727. [3] 夏俐 ,陈曦 , 赵千川 , 等 . 无线传感器网络及应用简介 [ J ]. 自动化博览 , 2004, 1 ( 1 ) : 34 - 37. [4] 黄润发 . VB 程序设计技术 [M ]. 北京 : 中国纺织大学 出版社 , 2001. [ 5 ] X R W ang, G L Xing, Y F Zhang, et al Integrated Cover2 . age and Connectivity Configuration in W ireless Sensor Networks[ J ]. 2003; Proc. ACM SenSys: 28 - 39. [ 6 ] H Zhang, J C Hou. M aintaining Sensing Coverage and Connectivity in Large Sensor Networks [ J ]. Technical report, 2003; U I CDCS - R: 23 - 51. U
因此 ,我们设计一个类似 Ping exe 的程序用于检测 . 对方是否开机 。根据 UDP, 给其它主机发送特定内 容的 UDP报文 ,对方在开机状态则可迅速回送相应 报文 ,如在规定时间内没有收到回送报文则产生无 应答消息 ,程序根据收到回送或无应答判断对方主 机是否已开机 。 M SDN (微软开发商网络 ) L ibrary提供了一个 C 语言编写的例程 p ing
[3]
4 束 语 结
鉴于传统的 C lient - Server模式的 Socket网络
通信不适用于系统内各主机需直接通信的应用场 合 ,在传统的 C lient - Server模式基础上加以改进 , 实现了对等模式的 Socket 网络通信 。并利用 UDP 协议的特点实现了对对方是否开机的快速检测 , 避 免了在通信对方未开机时连接时间较长的问题 。该 通信程序已经应用于某项目 , 实际应用表明该程序 通信稳定可靠 ,特别适合于系统内部对等主机间的 高速数据通信 。
, 将其改造为 VC ++程序 。
该程序主要有三部分 : ①产生报文 ; ②发送报文 ; ③ 接收回送报文 。 ①、 部分可直接使用例程中代 ② 码,③ 部分的接收函数需改进 。例程中的接收函数 返回 值 为
SOCKET _ ERROR 时 仅 处 理 了 W SAETI EDOUT M 事件 ,以此事件为是否开机的判据
在实际使用时发现判断结果有误 。因此增加了对
W SAECONNREFUSED、 SAENETUNREACH 事件的 W
处理 ,即仅以收到 W SAETI EDOUT 事件判断对方 M 为“ 未开机 ” 。实际使用表明经改进后判决结果准 确无误 。
参考文献 : [1] 李峰 . 利用流式 Socket编程实现 W indow s与 L inux的 通信 [ J ]. 微计算机信息 , 2006, 22 ( 3 ) : 112 - 113. [2] 张士刚 . C ++中实现局域网的数据通信 [ J ]. 福建电 脑 , 2006 ( 6 ) : 198 - 199. [ 3 ] M icrosoft Corp. M SDN L ibrary The October 2001 release [ CP /DK ]. USA: M SDN , 2001. [4] 王宏 ,李浩 ,鄢烈祥 . 套接字技术在远程优化操作支持 系统中的应用 [ J ]. 武汉理工大学学报 , 2006, 28 ( 6) : 63 - 65. [5] 蔡君巧 ,褚亮亮 ,许建龙 . 基于异步非阻塞套接字的网 络通讯 [ J ]. 现代电子技术 , 2006 (4) : 62 - 63.
更多搜索:基于对等模式的Socket网络通信
本文关键词:基于对等模式的Socket网络通信,,由笔耕文化传播整理发布。
本文编号:123853
本文链接:https://www.wllwen.com/kejilunwen/wltx/123853.html