Unix02_UNIX网络编程介绍.doc_第1页
Unix02_UNIX网络编程介绍.doc_第2页
Unix02_UNIX网络编程介绍.doc_第3页
Unix02_UNIX网络编程介绍.doc_第4页
Unix02_UNIX网络编程介绍.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UNIX网络编程入门 Unix是计算机使用的主流操作系统之一,TCP/IP是广为应用的互 连网协议,Unix为TCP/I P网络编程提供了一种网络进程通信机制:套 接字接口(Sockets Interface)。本文将介绍Un ix环境下套接字的基 本概念及编程技术,并结合实例说明在Unix下如何用套接字实现客户 机/服务器方式的进程通信。 一、套接字简介 套接字(Socket)是网络通信的基本操作单元,它提供了不同主机 间进程双向通信的端点,这些进程在通信前各自建立一个Socket,并通 过对Socket的读/写操作实现网络通信功能。 套接字分为以下3种类型。 1.字节流套接字 这是最常用的套接字类型,TCP/IP协议簇中的TCP(Transport Con trol Protocol)协议使用此类接口,它提供面向连接的(建立虚电路) 、无差错的、发送先后顺序一致的、包长度不限和非重复的网络信包 传输。 2.数据报套接字 TCP/IP协议族中的UDP(User Datagram Protocol)协议使用此类 接口,它是无连接的服务,以独立的信包进行网络传输,信包最大长度 为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文 传输或可靠性不重要的场合。 3.原始数据报套接字 提供对网络下层通讯协议(如IP协议)的直接访问,它一般不是提 供给普通用户的,主要用于开发新的协议或用于提取协议较隐蔽的功 能。 二、套接字系统调用 附表是Unix中套接字系统调用的简单说明。 附表 三、套接字编程方法 这里将分别介绍面向连接协议的字节流套接字与非连接协议的数 据报套接字的编程方法,因原始数据报套接字在实际工作中使用较少, 在此不作讨论。 不论何种套接字编程均采用客户机/服务器的协作模式,即由客户 进程向服务器进程发出请求,服务器进程执行被请求的任务并将结果 返回给客户进程。 字节流套接字的服务进程和客户进程在通信前必须建立连接。建 立连接及通信的步骤见图1。 1.服务进程首先调用Socket()创建一个字节流套接字,并调用bin d()将服务器地址捆扎在该套接字上,接着调用listen()监听连接请求 ,随后调用accept()做好与客户进程建立连接的准备,无连接请求时, 服务进程被阻塞; 2.客户进程调用Socket()创建字节流套接字,然后调用connect() 向服务进程发出连接请求; 3.当连接请求到来后,服务进程被唤醒,生成一个新的字节流套接 字,并用新套接字同客户进程的套接字建立连接,而服务进程最早生成 的套接字则继续用于监听网络上的服务请求 4.服务进程和客户进程通过调用read()和write()交换数据; 5.服务进程和客户进程通过调用close()撤消套接字并中断连接 。图1 面向连接协议的字节流套接字系统调用 图2 非连接协议的报套接字系统调用 数据套接字的服务进程客户进程通信前不必建立连接, 通信的步 骤见图2。 1.服务进程首先调用Socket()创建一个数据套接字,并调用bind( )将服务器地址捆扎在该套接字上,然后调用recvfrom()等待客户进程 发来的请求; 2.客户进程在调用Socket()创建一个数据报套接字后,调用bind( )将客户机地址捆扎在此套接字上,接着调用sendto()向服务进程发送 请求,然后调用recvfrom()等待服务进程返回该请求的处理结果; 3.服务进程在执行客户进程所请求的任务后,调用sendto()将处 理结果返回给客户进程 4.服务进程和客户进程通过调用close()撤消套接字。 UNIX网络编程入门之二 UNIX网络编程入门 四、套接字编程示例 下面给出一个运用字节流套接字在TCP/IP网络上实现客户机/服 务器方式进程通信的实例。 在此例中,服务进程先于客户进程运行,当双方建立连接后,服务 进程通过该连接向客户进程不断发送一个连续增长的序列数,客户进 程每接收到50个序列数就在屏幕上显示一个.,显示至20个点后换 行,直至任意一方进程被中断为止。 /*server.c*/ # include # include # include # include # include main() int sock,namelen,seq,netint; struct sockaddr-in server; /存服务器的internet地址 char msgsock; char buf1024; /创建internet域的TCP协议的字节流套接字 sock=socket(AF-INET,SOCK-STREAM,IPPROTO-TCP); if(sock # include # include # include # include main(argc,argv) int argc; char *argv; int sock,myseq,recvseq; struct sockaddr-in server;/存服务器的internet地址 struct hostcnt *h;/存主机信息 /命令行必须跟参数:服务器的主机名,该主机 /必须在/etc/hosts文件中定义,例如: / 1 hp486 if(argc!=2) printf(Usage:%s servernamen,argv0; exit(1); /创建internet域TCP协议的字节流套接字 sock=socket(AF-INET,SOCK-STREAM,IPPROTO-TCP); if(sockh-addr,&server.sinaddr,h-length); server.sinport=htons(1032); /填入公认的服务端口号与服 务进程建立连接if(connect(sock,&server,sizeof(server)UNIX网络编程入门之三 UNIX网络编程入门 五、结束语 虽然Sockets最早是作为BSD规范提出来的,并已成为Unix操作系 统下TCP/IP网络编程标准,但是,随着网络技术的不断进步,Sockets的 应用范围已不再局限于Unix操作系统和TCP/I P网络。目前,Windows 、Windows NT、Windows 95、OS/2、Sun OS、Netware等诸多的操作 系统都开始提供套接字接口,它们在兼容4.3BSD Unix Sockets的基础 上附加了一些适应自身操作系统特性的扩充内容,这些新版的Sockets 以操作系统内置或外挂的形式提供给程序员。W insock (Windows So ckets)便是一个用于Windows系列操作系统的Sockets版本。同时,套 接字所支持的网络协议种类也不断增加,例如,Winsock不仅支持TCP/U DP协议,而且支持IPX/SP X、AppleTalk、Decnet、NetBEUI等网络协 议,Netware的套接字支持TCP/UDP及IPX/SPX协议。另外,套接字还增 加了非C语言支持:如C+、BASIC、Pascal等。 由此可见,Sockets的开放性能正逐步完善,可以说已经成为网络 编程的通用接口,有了这个强有力的工具,我们可以构造任意跨操作系 统、跨网络协议的分布式处理系统。UNIX编程进阶 进 入 九 十 年 代 后, 随 着 计 算 机 和 网 络 技 术 的 发 展, 很 多 数 据 处 理 系 统 都 采 用 开 放 系 统 结 构 的 客 户 机/ 服 务 器 网 络 模 式, 即 客 户 机 提 出 任 务 请 求, 通 过 网 络 发 送 给 服 务 器, 由 服 务 器 做 相 应 处 理, 执 行 被 请 求 的 任 务, 然 后 将 结 果 返 回 给 客 户 机。 例 如: 银 行ATM 的 前 置 机 和 数 据 处 理 的 主 机 之 间 即 构 成 客 户 机/ 服 务 器 网 络 模 式; 电 话 银 行 的 前 置 机 和 银 行 数 据 处 理 机 之 间 也 构 成 这 种 网 络 模 式 结 构 等。 这 样, 如 何 在 前 置 机 和 数 据 主 机 之 间 进 行 信 息 交 换, 即 进 程 网 络 通 信, 就 成 为 实 现 这 种 网 络 模 式 的 基 础。 而TCP/IP 的 套 接 字 技 术 是 解 这 一 问 题 的 有 力 工 具。 它 从 提 出 时 就 一 直 发 挥 着 愈 来 愈 重 要 的 作 用, 并 已 成 为UNIX 操 作 系 统 下TCP/IP 网 络 编 程 标 准; 甚 至WINDOW、JAVA 都 配 有 它 的 通 用 接 口。 有 了 这 个 强 有 力 的 工 具, 我 们 可 以 实 现 异 种 机、 异 种 操 作 系 统 应 用 程 序 间 的 相 互 连 接 和 通 信。 套 接 字(sockets) 是 支 持TCP/IP 协 议 的 网 络 通 信 的 基 本 操 作 单 元。 可 以 将 套 接 字 看 作 不 同 主 机 间 的 进 程 进 行 双 向 通 信 的 端 点。 它 构 成 了 在 单 个 主 机 内 及 整 个 网 际 间 的 编 程 界 面。 一 般 来 说, 跨 机 应 用 进 程 之 间 要 在 网 络 环 境 下 进 行 通 信, 必 须 要 在 网 络 的 每 一 端 都 要 建 立 一 个 套 接 字, 两 个 套 接 字 之 间 是 可 以 建 立 连 接 的, 也 是 可 以 无 连 接 的, 并 通 过 对 套 接 字 的“ 读”、“ 写” 操 作 实 现 网 络 通 信 功 能。 类 似 于UNIX 系 统 中 的I/O 概 念, 像 文 件 那 样 有 打 开、 读、 写、 关 闭 的 方 式。 根 据 传 输 数 据 类 型 的 不 同, 套 按 字 可 分 为 面 向 连 接 的 数 据 套 接 字(stream sockets) 和 无 连 接 的 数 据 报 套 接 字(datagram sockets) 两 种 类 型。 1、 字 节 流 套 接 字 字 节 流 不 按 记 录 定 界, 在TCP/IP 协 议 簇 中 对 应TCP 协 议, 即 传 输 控 制 协 议(Transmition Control Protocol)。 它 是 一 个 提 供 给 用 户 进 程 可 靠 的 全 双 工 的 面 向 连 接 的 协 议, 大 多 数INTERNET 应 用 程 序 如ftp、telnet 使 用TCP 协 议。 通 信 端 点 使 用TCP 对 应 的INTERNET 地 址 互 相 连 接, 可 保 证 按 正 确 的 顺 序 以 及 单 一 和 可 靠 的 地 址 传 输 数 据。 由 于 它 是 字 节 流, 所 以 包 长 包 没 有 限 制, 信 包 传 输 也 不 重 复, 因 而 是 一 种 常 用 的 套 接 字 类 型。 2、 数 据 报 套 接 字 数 据 报 对 应 记 录 型 数 据 流, 在TCP/IP 协 议 簇 中 对 应UDP 协 议, 即 用 户 数 据 报 协 议(User Datagram Protocol)。 利 用 数 据 报 服 务 可 实 现 一 些 简 单 的 网 络 服 务, 如 网 点 检 测 程 序PING。 由 于 不 建 立 连 接, 数 据 报 协 议 比 连 接 协 议 快。 但 不 能 保 证 所 有 数 据 都 准 确 有 序 地 到 达 目 的 地。 不 保 证 顺 序 性、 可 靠 性 和 无 重 复 性。 它 是 无 连 接 的 服 务, 以 独 立 的 信 包 进 行 传 输, 通 信 端 点 使 用UDP 对 应 的INTERNET 地 址。 双 方 不 需 互 连, 按 固 定 的 最 大 长 度 进 行 传 输, 因 而 适 用 于 单 个 报 文 传 输, 或 较 小 文 件 的 传 输。 套 接 字 的 编 程 要 点 及 和 过 程 不 论 何 种 套 接 字 编 程, 均 采 用 客 户 机/ 服 务 器 方 式, 其 运 作 过 程 基 本 类 似, 限 于 篇 幅, 这 里 仅 介 绍 字 节 流 套 接 字。 字 节 流 套 按 字 的 服 务 进 程 和 客 户 进 程, 在 通 信 前 必 须 创 建 各 自 的 套 接 字 以 建 立 连 接, 然 后 对 相 应 的 套 接 字 进 行“ 读”、“ 写” 操 作, 实 现 信 息 的 交 换。 1.服 务 器 进 程 创 建 套 接 字。 服 务 进 程 总 是 先 于 客 户 进 程 启 动, 服 务 进 程 首 先 调 用socket() 函 数 创 建 自 已 端 的 一 个 字 节 流 套 接 字, 并 提 供 三 个 参 数: 网 络 地 址 类 型, 一 般 取AF_INEF(Adress family InterNET); 套 接 字 类 型, 这 里 取SOCK_STREAM; 网 络 协 议, 缺 省 为TCP/IP 协 议, 对 应 参 数 为0。 2.给 套 接 字 地 址 变 量 赋 初 值。 在 生 成 套 接 字 后, 要 用 服 务 器 的 地 址 先 对sockaddr_in 结 构 变 量 赋 初 值。sockaddr_in 在/usr/include/netinet/in.h 中 有 定 义, 它 只 适 用 于INTERNET 地 址 类 型, 含 有INTERNET 套 接 字 地 址 类 型、IP 端 口 号、IP 地 址 等 信 息。 地 址 类 型 可 取 定 为AF_INET,IP 地 址 对 服 务 器 可 取 任 意 合 法 地 址INADDR_ANY。IP 端 口 号 可 由 用 户 设 定, 但 要 注 意 主 机 字 节 顺 序 向 网 络 字 节 顺 序 的 转 换。 3.给 套 接 字 命 名。 由socket() 函 数 创 建 的 套 接 字 是 没 有 名 字 的。 所 谓 命 名, 就 是 用bind() 函 数 将 服 务 器 地 址 捆 绑 到 创 建 的 套 接 字 上。 4.服 务 器 进 程 准 备 接 受 来 自 客 户 机 的 连 接 请 求。 首 先 调 用listen() 函 数, 让 服 务 器 进 程 进 入 监 听 状 态; 然 后 调 用accept() 函 数, 准 备 接 受 客 户 机 的 连 接 信 号。 无 连 接 请 求 时, 服 务 进 程 被 阻 塞。 5.客 户 进 程 调 用socket() 函 数 创 建 已 端 的 套 接 字。 6.给 客 户 端 的sockaddr_in 结 构 体 变 量 赋 值。 地 址 类 型 仍 可 取AF_INET, 端 口 号 和 服 务 器 方 的 端 口 号 相 同, 欲 连 服 务 器 的 地 址 通 过 调 用inet_addr() 转 换 得 到。 也 可 通 过gethostbyname() 函 数 将 名 字 转 换 为 指 向hostent 结 构 变 量 的 指 针, 再 将hostent 结 构 变 量 的 地 址 成 员 用bcopy() 复 制 到sockaddr_in 结 构 变 量 上。 7.客 户 方 调 用connect() 函 数 向 服 务 进 程 发 出 连 接 请 求。 8.当 连 接 请 求 到 来 后, 被 阻 塞 服 务 进 程 的accpet() 函 数 生 成 一 个 新 的 字 节 流 套 接 字, 并 返 回 客 户 机 的sockaddr_in 结 构 变 量, 从 而 在 服 务 器 应 用 程 序 中 用 新 的 被 赋 予 客 户 机 地 址 的 套 接 字 同 客 户 进 程 进 行 连 接, 然 后 向 客 户 方 返 回 接 受 信 号。 9.一 旦 客 户 机 的 套 接 字 收 到 来 自 服 务 器 的 接 受 信 号, 则 表 示 客 户 机 与 服 务 器 双 方 已 实 现 连 接。 任 一 方 均 可 向 对 方 发 送, 也 可 接 收 对 方 发 来 的 数 据。 这 既 可 通 过send()、recv() 函 数 来 实 现。 也 可 通 过read()、write() 函 数 来 交 换 数 据。 10.服 务 进 程 和 客 户 进 程 可 通 过 调 用shutdown() 和colse() 关 闭 套 接 字 上 的 所 有 发 送 和 接 收 操 作, 撤 销 套 接 字 并 中 断 连 接。 上 述 所 有 系 统 函 数 均 包 括 在libsocket.a 系 统 库 中,IBM PC(UNIX) 操 作 系 统 编 译 时 需 加-llibsocket 链 接。IBM RS/6000(AIX) 操 作 系 统 统 编 译 时 无 需 此 参 数。 编 程 示 例 本 文 给 出 一 个 运 用 字 节 流 套 接 字, 在TCP/IP 网 络 上 实 现 客 户 机/ 服 务 器 方 式 进 程 通 信 的 实 例, 该 程 序 在IBM RS/6000 小 型 机 和IBM PC 586 微 机 上 调 试 通 过。 它 主 要 模 拟 根 据 帐 号 查 询 余 额 的 过 程, 客 户 机 是 一 台 电 话 银 行 的 前 置 机(IBM PC), 服 务 器 是 银 行 数 据 处 理 主 机(IBM RS/6000), 包 括 三 方 面: 1.客 户 机 从 标 准 输 入 读 入 帐 号, 并 将 该 帐 号 发 送 给 服 务 器。 2.服 务 器 接 收 该 帐 号 后, 进 行 判 断 是 否 有 此 帐 号 的 数 据, 并 将 结 果 返 回 给 客 户 机。 3.客 户 机 接 收 返 回 的 信 息, 并 将 结 果 输 出 在 标 准 输 出 上。 服 务 进 程 需 先 于 客 户 进 程 启 动。 客 户 进 程 启 动 时 要 携 带 服 务 器 的IP 地 址, 如:clientpros 在UNIX 操 作 系 统 下 可 用Doscp 命 名 拷 入 硬 盘; 编 译 时 用: cc hxserver.c -lsocket -0 server cc hxclient.c -lsocket -0 client 在AIX 操 作 系 统 下 可 用Dosread 命 名 拷 入 硬 盘, 编 译 时 用: cc hxserver.c -0 server cc hxclient.c -0 client /*服务器端程序:hxserver.c*/ #include #include #include #include #include tcpipop.c main() int newsockfd, sockfd; int clilen; struct sockaddr_in cli_addr, serv_addr; char info100; int infolen; int rc; if (sockfd = socket(AF_INET, SOCK_STREAM, 0) 0)/*创建TCP协议的字节流*/ fprintf(stderr, Socket failed !n); return(-1); bzero(char *)&serv_addr, sizeof(serv_addr);/*服务器地址清0*/ serv_addr.sin_family = AF_INET;/*网络类型使用ARPA internet地址*/ serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /*IP地址取公认的任意合法地址*/ serv_addr.sin_port = htons(1234); /*设定IP端口号, 并将主机字节顺序转换为网络字节顺序*/ if ( bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr) 0 ) /*将服务器地址信息捆绑到创建的套接字上*/ fprintf(stderr, Bind failed !n); return(-1); if ( listen(sockfd, 5) 0 )/*建立长度为5的监听队列从套接字上收听连接请求*/ fprintf(stderr, Listen failed !n); return(-1); fprintf(stderr, blocked here.n); clilen = sizeof(cli_addr); /*阻塞至客户方有连接请求到来*/ newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen); /*有连接请求时, 返回被赋予客户机地址的新套接字, 连接已建立*/ fprintf(stderr, connected now!n); if ( newsockfd = 10 ) exit(-1); /*此时连接已建立, 可通过对套接字的读写实现通信*/ memset(&data,0,sizeof(data); printf(enter account no

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论