logo资料库

基于TCP_IP协议的WinSock网络编程及应用.pdf

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
计算机时代 !""# 年 第 $ 期 !P· · 基于 567897 协议的 ’().+/0 网络编程及应用 程咏喜,蒋 珉 O东南大学自动化研究所,江苏 南京 !%""PM4 摘 要:本文介绍了以 567897 为基础、基于客户机 8 服务器( 68.)模型,在 ’()!""" 平台、Q6RRMS" 环境下利用 ’()*+,- 套接字O.+/0124& 进行网络编程的相关技术,并应用于车间自动化生产,实现了上、下位计算机之间有效的数据传输。 关键词:567897;套接字;客户机 8 服务器;网络编程;数据传输 %& ’()*+,-& .+/012- &&&& 长 久 以 来 ’()*+,- 套 接 字3.+/012-4一 直 是 以 567897 为 基 础的网络编程的一种重要实现方式。套接字是通讯的 基 石 ,是 支持 567897 协议网络通信的基本操 作 单 元 , 可 以 将 套 接 字 看 作是网络上不同主机的进程进行双向通信的端点。目前套接字 已成为最流行的网络通信应用程序接口之一,已经形 成 了 一 套 完整的标准,即 ’()*+,-: .+/012- 规范,简称 ’().+/0。 ’().+/0 规范定义 了 一 套 可 使 网 络 程 序 开 发 人 员 在 ’(); *+,- 下开发标准的 567897 网络程序接口,它不仅包含人们所 熟 悉 的 <1=01>1?: .+/012: 风 格 的 库 函 数 , 还 包 含 了 一 组 针 对 ’()*+,-: 的 扩 展 库 函 数 , 以 使 程 序 员 能 充 分 地 利 用 ’()*+,-: 消息驱动机制、异步网络 事 件 选 择 方 式 进 行 编 程 。’().+/0 规 范 定 义 并 记 录 了 任 何 使 用 @79 与 9)21=)12 通 讯 协 议( 97.,通 常 指 567897) 连接。应用程序使用 ’()*+,-: .+/012- 的 @79,而 ’()*+,-: .+/012- 又利用下层的网络通信协议与操作系统以产 生实际的通信,它们之间的关系如图 % 所示。 图 %:: 应用程序与 ’()*+,-: .+/012- 关系图 提到在 567897 协议下利用 ’().+/0 进行网络编程,自然 就会涉及到 68.( 客户机 8 服务器)模型。一般说来,在 567897 网络中两个进程之间的相互作用的模式是 68. 模 式 ,在 这 种 操 作 模 式 下 ,服 务 器 要 先 启 动 ,客 户 应 用 程 序 向 服 务 器 程 序 请 求 服 务 ,然 后 服 务 器 响 应 客 户 请 求 并 提 供 相 应 服 务 ,这 种 方 式 隐 含了在建立 68. 间通信时的非对称性。 !: 6.+/012 网络编程 AB6 提 供 了 两 个 ’()*+,-: .+/012- 封 装 类 , 即 6@-?)/; .+/012: 和 6.+/012: 。 它 们 使 编 程 工 作 变 得 相 对 简 单 , 尤 其 是 6.+/012,它 派 生 自 6@-?)/.+/012,继 承 了 6@-?)/.+/012: 的 许 多封装了 @79: 的成员函数,提供了通过 6@=/C(D1 对象使用套 接字更高级抽象,并且管理了通信的大多数方面。更 重 要 的 是 6.+/012: 类提 供 了 对 于 同 步 操 作 6@=/C(D1: 对 象 十 分 重 要 的 阻 塞功能,且 6.+/012: 通过与类 6@=/C(D1: 和 6.+/012B(>1: 一起来 管理数据的接收和发送,使我们在设计时不需考虑 网 络 的 位 顺 序和字符间的转换问题,从而收发数据变得简单明了。 对于套接字来说,其归档对象是与 6.+/012B(>1: 对象相关 的而非标准的 6B(>1,与连接到一个磁盘文件不同,6.+/012B(>1: 对象连接到 6.+/012 对象。一个 6@=/C(D1 对象将负责管理一个 缓冲区。当发送归档对象的缓冲区被填满时,相关的 6.+/012; B(>1 对象将缓冲区里的内容取出,清空与套接字相关的归档缓 冲 区 与 发 送 信 息 等 价 。 当 接 收 归 档 对 象 的 缓 冲 区 被 填 满 时 , 6.+/012B(>1 对象停止读出直到缓冲区可用。 6.+/012 对象实际上是个两态对象,即有时同步有时又异 步,但通常情况下是异步状态。在异步状态,套接字能够接收来 自框架的异步通信,但在操作过程中,如数据接收或发 送 时 ,套 接字就切换到同步状态。这就意味着套接字将不能接收其它异 步通信,直到同步操作完成。 下 面 简 要 介 绍 利 用 6.+/012, 并 结 合 6.+/012B(>1 和 6@=/C(D1 对 象 进 行 68. 模 式 下 计 算 机 之 间 通 信 的 一 般 网 络 编 程 模 型 ,注 意 它 只 适 用 于 .2=1EF 套 接 字 ,这 主 要 是 因 为 GE2E; H=EF 套接字不能使用 6@=/C(D1。 %、分别构造服务器和客户端套接字对象; !、调用套接字对象的 6=1E21: 函数创建套接字,而 6=1E21 函数会调用 <()* 函数将此套接 字 绑 定 到 指 定 的 地 址 , 并 为 服 务器套接字指定端口号; I、服务器调用 J(-21) 函数开始侦 听 客 户 的 连 接 请 求 ,而 客 户调用 6+))1/2: 函数向服务器发出连接请求; #、当服务器侦听到客户端连接请求时, 就 创 建 一 新 套 接 字,并将其传送给 @//1K2 函数以接收客户请求; L、为服务器和客户端套接字分别创建一个与 之 相 关 联 的 6.+/012B(>1 对象; M、为服务器和客户端套接字分别创建一 个( 或 两 个 )与 6.+/012B(>1 对象 相 关 联 的 6@=/C(D1 对 象 以 进 行 数 据 的 接 收 和 发送工作; $、使 用 6@=/C(D1 对 象 在 服 务 器 和 客 户 端 套 接 字 之 间 传 送 数据; N、在任务执行完毕后,将 6@=/C(D1、6.+/012B(>1 和 6.+/012& 一并销毁。
V1· · !"#$%&’())*(+,)-".,/,,0112 34"567& 与 34"587&9:;7,3<(5=:>7 相 结 合 的 完 整 编 程 步 骤 [O ICA^_$4"587 &SPQIL&7@ AGGOO aa 侦听连接 如图 0 所示。 47(>7( 3;I7@& 34"587&, L7(>7(4"587& 34"587&, 5;I7@&4"587& L7(>7(4"587&.3(7+&7K$"(&G 5;I7@&4"587&.3(7+&7KG 5"@@75&I"@, (7R%7L& L7(>7(4"587&.QIL&7@KG L7(>7(4"587&.QIL&7@KG 34"587&, (75>4"587& L7(>7(4"587&.<557$&K(75>4"587&G (7&%(@ ] b (7&%(@O ] b >"IFO 33=+(I"&Y;Z EEJ@c7@FI@Z<557$& AG [O $4"587&‘@7UO 347(>7(4"587& A&HIL G] ICA^_$4"587&SP<557$& Ad$4"587& GGOO aa 接受连接请求 5;I7@&4"587&.3"@@75&KL&(4"587&G 34"587&9I;7, CI;7KB5;I7@&4"587&G 3<(5=:>7, +(?@ABC:;7D) 3<(5=:>7EE;"+FG 3<(5HI>7, +(J%&KBCI;7D, 3<(5HI>7EEL&"(7G 3<(5HI>7, +(?@KBCI;7D, 3<(5HI>7EE;"+FG 3<(5HI>7, +(J%&KBCI;7D, 3<(5HI>7EEL&"(7G +(?@MMF+&+?@,, JNO, +(J%&PPF+&+J%& +(?@MMF+&+?@,, JN,, +(J%&PPF+&+J%& F+&+, &(+@LC7( 图 0,, 34"587& 模型编程步骤 对 于 34"587&,处 理 网 络 事 件 通 知 函 数 J@<557$&KG、J@N7S 57I>7KG和 J@3;"L7KG依然可用,这可以通过重载基类对应的函数 即可,但永远不要试图调用 J@3"@@75&KG和 J@47@FKG。这时需要 调 用 3"@@75&KG来 与 服 务 器 进 行 连 接 ,但 这 种 调 用 会 发 生 阻 塞 , 它 要 一 直 等 到 成 功 地 与 服 务 器 建 立 了 连 接 或 者 有 错 误 发 生 才 返回。这是由于 34"587& 类的缺省方式是阻塞方式的缘故造成 的。如果这时采用多线程技术,为调用 3"@@75&KG建立一个工作 线程,则在调用该函数发生阻塞时,主线程就不会受其影响。同 样 ,可 以 为 数 据 接 收 和 发 送 创 建 工 作 线 程 ,该 工 作 线 程 可 以 在 后台运行,套接字在工作线程中的阻塞不会影响到主 线 程 中 的 其它活动,可以继续处理其它诸如 TI@F"UL 窗口和消息事件。 但在实际运用多线程进行网络编程时,必须考虑套接 字 对 象 的 b 7;L7 F7;7&7O $4"587& ] b V .X .0O 接收数据和发送数据 >"IFO 347(>7(4"587& EEJ@N757I>7 AI@&O @f(("(3"F7 gO [O 34"58’& EEJ@N’5’I>’ A@f(("(3"F’ G] F"O [O ^_$Y;hSP47(I+;Ii7 Ad^_$<(5HI>7?@ G]OO aa 序列化接收数据 ICAA^_$Y;ZSP^_$ 4"587& G‘‘-\QQG (7&%(@ ] b UHI;7Aj^_$<(5HI>7?@SP?Lk%CC7(f^$&l KGG],, aa 循环接收 b >"IF, 347(>7(4"587& EEJ@c7@FI@Z47@F KG [, ICK^_$<(5HI>7J%& m‘-\QQG,,,,,,,,,,,,,,, [, ^_$Y;ZSP47(I+;Ii7 Kd^_$<(5HI>7J%& G],, aa 序列化发送数据 ^_$<(5HI>7J%&SP9;%LH KG] b, aa 只有调用此函数,才能真正在网络上发送 b V .X .V, 初始化函数 同 步 问 题 ,对 套 接 字 调 用 时 ,如 果 不 进 行 同 步 将 可 能 导 致 不 可 >"IF, 347(>7(4"587& EEJ@?@I&I+&7 KG, aa 对象初始化 预测的结果。 V, 实际应用 某 制 造 企 业 光 电 管 生 产 车 间 ,由 置 于 现 场 的 计 算 机( 下 位 机) 通过数据采集卡采集产品生产过程中各检测点及控制点, 并 将 获 得 的 及 进 行 初 步 处 理 的 数 据 上 传 给 管 理 计 算 机( 上 位 机),上位机在收到传来数据后及时分析并作出相应处理,然后 发送指令给下位机,由下位机处理控制现场产品生产 。 结 果 表 明 ,采 用 这 种 方 式 能 有 效 的 控 制 现 场 产 品 生 产 的 质 量 ,提 高 产 品单位时间生产效率,有效控制单位产品成本。 本 系 统 的 实 现 采 用 本 文 介 绍 的 通 过 使 用 34"587& 并 结 合 34"587&9I;7,3<(5=I>7 等 W93 类实现了上 、下 位 计 算 机 之 间 的 数据通信,以下是网络通信关键步骤代码。 V.X, 服务器端 V.X .X, 套接字创建、侦听连接、新建一套接字接受连接 >"IF, 33H+(I"&Y;Z EEJ@3(7+&7 KG, [, \$F+&7Y+&+ KG] ^_$4"587&‘@7UO 3QIL&7@I@Z4"587& A&HIL G] ICA^_$4"587&SP3(7+&7 A2111 GGOO aa 指定端口创建 [, ^_$9I;7, ‘, @7U, 34"587&9I;7 K&HIL G] ^_$<(5HI>7?@, ‘, @7U, 3<(5HI>7 K^_$9I;7 D3<(5HI>7 EE;"+F G] ^_ $<(5HI>7J%&, ‘, @7U, 3<(5HI>7 K^_$9I;7 D3<(5HI>7 EEL&"(7 G] b V.0, 客户机端 实际上客户端程序和服务器程序相似,同样要创建套接字 并进行接收和发送数据( 代码就不列出),不同的是在进行数 据传输之前,要进行和服务器端的连接。 kJJQ, 33H+(I"&Y;Z EEJ@3"@@75&I"@ KG, [, \$F+&7Y+&+ KG] ^_$4"587&‘@7U, 33;I7@&4"587& K&HIL G] ICK^_$4"587 &SP3(7+&7 KGG,, aa 创建 [, ICKm^_$4"587&SP3"@@75& aa 指定 ?c 地址和端口 [, F7;7&7, ^_$4"587& ], aa, 创建失败则删除 K^_I$+FF(7LL D2111 GG ^_$4"587&‘-\QQ ] (7&%(@, 9
21· · !"#$%&’())*(+,)-".,/,,0112 和 =(+93’ 数据库中。 _V 使用 =(+93’V =‘a’9&4V b"(V =cH 访问 =(+ 93’ 数据库 =(+93’ 公 司 提 供 了 一 个 =(+93’V =‘a’9&4V L"(V =cH 的 技 术 ( 简称 1121),使 Y@4%+3V d+4@9 及 dJeZ、YJZZ 等 [fc 高级语 言 对 =(+93’ 数 据 库 进 行 访 问 成 为 可 能 。 =(+93’ 的 =cH 对 象 ( ==2=)是 一 种 进 程 中 的 =cH 服 务 器 ,它 提 供 了 一 种 对 象 层 次 结 构 ,与 gN= 非 常 相 似 ,但 却 不 采 用 =gdJ 标 准 。 它 利 用 =(+93’ 的调用接口来与 =(+93’ 会话,其中 =(+93’ 的调用接口是 一种本地代码驱动器,它仅用于访问 =(+93’ 数 据 库 。==2= 拥 有优异的功能性访问 =(+93’ 数据库,其他任何数据库访问方式 很难达到它的功能性。 =(+93’V =‘a’9&4V b"(V =cH 主要可用的对象列示如下: =(+J3@’>&V 定 义 一 个 工 作 站 客 户 , 它 能 对 所 有 =(+8’44@"> 对象进行管理。和 gN= 的 gdH>h@>’ 建立方式一样,=(+J3@’>& 对象系统通常会根据需要而自动建立。 =(+8’44@">V Yd 应 用 程 序 和 =(+93’ 服 务 器 的 接 口 , 管 理 =(+g+&+‘+4’ 集,提供了共享连接及事务控制功能。 =(+J">>’9&V 表示一个与 =(+93’ 数据库的单一连接。 =(+g+&+‘+4’V 表示一个实现连接的数据库。 =(+Q+(+6’&’(V 表示一个在 8ic 语句或 QcR8ic 块 中 的 变 量 。 =(+Q+(+6’&’( 对 象 间 接 地 通 过 =(+g+&+‘+4’ 对 象 的 =(+Q+(+6’&’(4 数据集合来增加、存取或删除某个变量。 =(+gj>+45&V 8icV 85359& 语句的查询结果。 =(+L@53^V =(+gj>+45& 对象中的一列( J"3%6>)或数据项目 A^+&+V @&56k。 =(+L@’3^ 对 象 是 间 接 从 =(+gj>+4’& 对 象 的 =(+L@’3^4 数据集合A9"33’9&@">k取得其中的一个字段的数据。 下例代码显示如何使用 ==2= 访问 =(+93’ 数据库。 l, =(+93’ 对象定义 g@6, =(+8’44@">, N4, =‘a’9& g@6, =(+g+&+‘+4’, N4, =‘a’9& g@6, =(+F’9"(^4’&, N4, =‘a’9& J">4&, J">>’9& m) nV o%4’(TR$+44Tp J">4&) g+&+‘+4’-+6’ q) n) p=FN8HFYHFp g@6) ]r) N4) ?>&’h’( =>) H(("() f"E") ’((s+>\3’ 8’&) =(+8’44@">) n) J(’+&’=‘a’9&) tp=(+93’?>Q("98’(P’( . u=(+8’44@">p C)) v, 创建 8’44@"> 对象 8’&, =(+g+&+‘+4’, n, =(+8’44@"> ., =$’>g+&+‘+4’ tg+&+‘+4’-+6’ qX, J">>’9& qX, 1wC,, v, 建立数据库连接 8’&, =(+F’B"(\4’&, n, =(+g+&+‘+4’ ., J(’+&’gj>+4’& tp4’3’B&, x, b("6, &7jyh3pX, 1wC,, v, 生成对表 &7jyh3 的查询 ..., ... ’((s+>\3’ : v, 出错处理 ]r, n, ?>8&( tH((.g’49(@$&@"> X, p=FN;pC ?b, ]r, z<, 1, Ey’> 8’3’9&, J+4’, {@\tH((.g’4B(@$&@"> X, ]r, Z, 2X, _C J+4’, p1T1T/p {4hd"|, p 数据库配置的用户名或密码不正确!pX, T}X, p 错误 p J+4’, pT0T_2p {4hd"|, p 配置的网络服务器不正确!pX, T}X, p 错误 p J+4’, p1T1[2p {4hd"|, p 数据库未启动!pX, T}X, p 错误 p J+4’, H34’ {4hd"|, H((.g’49(@$&@"> X, T} X, p 错误 p H>\, 8’3’9& H34’ {4hd"|, H((.g’49(@$&@"> X, T}X, p 错误 p H>\, ?b }, 结束语 在 Yd 中 实 现 访 问 =(+93’ 数 据 库 的 方 式 有 多 种 。gN= 适 用初学者学习数据库技术;Ng= 速度快、功能强大;=(+93’, g+; &+, J">&("3 使用简单,但 代 码 编 写 不 方 便 ;==2= 是 =(+93’ 的 最 佳 典 型 性 产 品 ,它 所 支 持 的 =(+93’ 功 能 比 其 他 产 品 要 多 ,是 一 个稳定而成熟的开发环境,目前基于 =(+93’ 数 据 库 的 用 Yd 程 序语言开发的应用系统基本上都是通过 ==2= 来实现的。 参考文献: STU, 李善茂等.Y@4%+3, d+4@9, }.1 高级编程技巧.电子工业出版社XT~~~ . S0U 潭小丹等.Y@4%+3, d+4@B, }.1 数据 库 编 程 思 想 与 实 践. 冶 金 工 业 出 版 社X0110 . !J,, H !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! t上接第 [1 页C ’345, 67$8"9:5&;<=>?>@&@+&’ A67$8"B:’& CD (’&%(>) EFGH D I ,,,, 以上是通信的一些关键步骤,还须添加一些辅 助 代 码 以 完 善 程 序 ,尤 其 要 注 意 创 建 的 套 接 字 对 象 在 退 出 前 要 析 构 ,在 堆 中 创 建 的 对 象 也 要 删 除( 这 一 步 很 重 要 ,否 则 会 造 成 堆 内 存 泄 露、堆内碎块等问题)。 2, 结束语 利用 J8"9K5& 类 并 结 合 J8"9:5&LM35、JN(9O@P5 类 是 实 现 网 络编程进行数据传输的有效手段,使用方便。如果能 将 多 线 程 技术 引 入 到 J8"9:5& 网 络 编 程 中 以 有 效 的 避 免 阻 塞 的 话 ,那 么 J8"9:5& 将是更好的选择。多线程网络技术在开发基于 EJQR?Q 的分布式应用程序中将发挥更大的作用。 参考文献: STUV 邓全良.W@>8"9: 网络程序设计.中国铁道出版社X0110 . S0U, 汪晓平X 钟军.Y@4%+3, JZZ 网络通信协议分析与应用实 现. 人 民 邮 电 出版社X011[ . S[U, 萧秋水X文娟.W@>\"]4 网络编程 YJ 篇.清华大学出版社X011T . S2U, 王 刚 X 林 立 志 . 基 于 W@>^"]4 的 EJQR?Q 编 程 . 清 华 大 学 出 版 社 X 0110 . !J,, H
分享到:
收藏