基于ARM-Linux的网络通讯设计实验(下位机)_第1页
基于ARM-Linux的网络通讯设计实验(下位机)_第2页
基于ARM-Linux的网络通讯设计实验(下位机)_第3页
基于ARM-Linux的网络通讯设计实验(下位机)_第4页
基于ARM-Linux的网络通讯设计实验(下位机)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1 基于 ARM Linux 的网络通讯设计实验 下位机实验部分 一 实验目的 1 了解 ARM Linux 操作系统的基本构成 2 掌握 ARM Linux 下的网络通讯程序的设计与编译 3 掌握 ARM Linux 的文件系统的修改及构建方法 二 实验内容 下位机程序设计 在 Linux 环境下用 C 语言编写基于 TCP 协议的数据收发的下位机程序 作为服务 器端 可实现从上位机 客户端 接收数据并回传给上位机 然后 对程序进行交叉编译 最后修改及 构建 ARM Linux 的文件系统 使之能在 ARM 模块上运行 三 预备知识 1 C 语言 2 TCP 网络传输协议的原理及工作方式 四 实验设备与工具 硬件 测试技术与嵌入式系统综合实践平台 微型计算机 软件 Windows 操作系统 超级终端 虚拟机软件 VMware 预装 Linux 操作系统 Fedora 6 及 ARM Linux 开发环境 五 实验原理概述 1 ARM 实验模块 ARM Advanced RISC Machines 既可以认为是一个公司的名字 也可以认为是对微处理器的通称 还可以认为是一种技术的名字 ARM 处理器是一个 32 位元精简指令集 RISC 处理器架构 其广泛地 使用在许多嵌入式系统设计 和 Intel 的 x86 为代表的复杂指令集 RISC 处理器相比 ARM 的特点是 体积小 低功耗 低成本 高性能 支持 Thumb 16 位 ARM 32 位 双指令集 能很好的兼容 8 位 16 位器件 大量使用寄存器 指令长度固定 指令执行速度快 大多数数据操作都在寄存器中完成 寻 址方式灵活简单 执行效率高 外围接口丰富 包含有如 UART USB MCI SPI 以太网接口等 ARM 处理器可以很好地支持 Linux VxWorks PSOS 等嵌入式操作系 成为嵌入式系统处理器的主流 广泛应用于平板电脑 智能手机 手持 便携式智能设备等 2 本实验模块采用了 ATMEL 公司推出的工业级的 ARM9 处理器 AT91RM9200 配置了 16MB 的 SDRAM 4MB 的 FLASH USB Host 端口 RS232 接口 以及以太网接口等 实验模块的硬件框图如下 AT91RM9200 SDRAM FLASH Ethernet PHY RJ45 USB 2 0 Host Ethernet MAC UART RS232 Convertor 其中 SDRAM 提供 ARM Linux 系统运行所需放入内存 FLASH 作为非易失性的存储器 用于存放 ARM Linux 系统的引导程序 Uboot 以及 ARM Linux 的内核镜像和文件系统镜像 AT91RM9200 自带了以 太网接口的 MAC 层 设计者可根据具体的物理传输介质选用相应的物理层芯片 本实验模块选用的是针 对双绞线传输介质的物理层芯片 DM9161 AT91RM9200 自带的 UART 通用异步收发器 接口并不支 持计算机的 RS232 电平 因此 本实验模块采用了 MAX232 芯片来实现 UART 接口到 RS232 接口的转 换 另外 AT91RM9200 自带了 USB2 0 全速 Full Speed 接口 可以直接引出 ARM 实验模块采用了四层 PCB 布版设计 实物图如下所示 2 ARM Linux 交叉编译环境 在本实验中 我们需要设计程序并在 ARM 上运行 但由于受到 ARM 处理器资源 包括人机接口 存储器容量等 的限制 我们无法在 ARM 上编写源程序以及将其编译成目标程序 因此 我们需要在 PC 机平台上编写并编译能在 ARM 上运行的目标程序 在一种计算机环境中运行的编译程序 能编译出在另外一种环境下运行的代码 这个编译过程就叫交 叉编译 简单地说 就是在一个平台上生成另一个平台上的可执行代码 这里需要注意的是所谓平台 实际上包含两个概念 体系结构 Architecture 操作系统 Operating System 同一个体系结构可以运 以太网接口 RJ45 RS232 接口 USB Host 接口 FLASH 芯片 2 8MB SDRAM 芯片 电源接口座 ARM 处理器 以太网物理层芯片 复位按键 网络变压器 以太网时钟晶振 ARM 时钟晶 振 电源转换芯片 3 行不同的操作系统 同样 同一个操作系统也可以在不同的体系结构上运行 举例来说 我们常说的 x86 Linux 平台实际上是 Intel x86 体系结构和 Linux for x86 操作系统的统称 而 x86 WinNT 平台实际上是 Intel x86 体系结构和 Windows NT for x86 操作系统的简称 交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的 我们常用的计算机软件 都需要 通过编译的方式 把使用高级计算机语言编写的代码 比如 C 代码 编译 compile 成计算机可以识别 和执行的二进制代码 比如 我们在 Windows 平台上 可使用 Visual C 开发环境 编写程序并编译成 可执行程序 这种方式下 我们使用 PC 平台上的 Windows 工具开发针对 Windows 本身的可执行程序 这种编译过程称为 Native Compilation 中文可理解为本机编译 然而 在进行嵌入式系统的开发时 运 行程序的目标平台通常具有有限的存储空间和运算能力 比如常见的 ARM 平台 其一般的静态存储空 间大概是 16 到 32MB 而 CPU 的主频大概在 100MHz 到 500MHz 之间 这种情况下 在 ARM 平台上进 行本机编译就不太可能了 这是因为一般的编译工具链 Compilation Tool Chain 需要很大的存储空间 并需要很强的 CPU 运算能力 为了解决这个问题 交叉编译工具就应运而生了 通过交叉编译工具 我 们就可以在 CPU 能力很强 存储空间足够的主机平台上 比如 PC 上 编译出针对其他平台的可执行程 序 要进行交叉编译 我们需要在主机平台上安装对应的交叉编译工具链 Cross Compilation Tool Chain 然后用这个交叉编译工具链编译我们的源代码 最终生成可在目标平台上运行的代码 常见的交叉编译 例子如下 1 在 Windows PC 上 利用 RVDS ARM 开发环境 使用 armcc 编译器 则可编译出针对 ARM CPU 的可执行代码 2 在 Linux PC 上 利用 arm linux gcc 编译器 可编译出针对 Linux ARM 平台的可执行代码 3 在 Windows PC 上 利用 cygwin 环境 运行 arm elf gcc 编译器 可编译出针对 ARM CPU 的可执 行代码 3 虚拟机 VMware 简介 通常 一台计算机安装一个常用的操作系统 而当我们需要使用多个操作系统 而硬件平台有限的时 候 就希望在同一台计算机上使用多个操作系统 往往采用的方法是分别安装它们 然后采用 多启动 的方式 分别引导计算机进入所需的操作系统 尽管这种方式可以实现在同一台计算机上使用多个操作 系统 但多启动系统在一个时刻只能运行一个操作系统 想要切换操作系统时必须重新启动机器 重新 引导进入所需的操作系统 这给用户的使用带来了不便 VMWare 是一个 虚拟机 软件 它使用户可以在一台计算机上同时运行二个或更多的操作系统 如 Windows2000 WindowsXP DOS LINUX 等系统 与 多启动 系统相比 VMWare 采用了完全不同 的概念 是真正的 同时 运行 多个操作系统在主系统的平台上 就象 Word Excel 那样 作为一个标 准的 Windows 应用程序 可以方便地切换 VMWare 需要一个操作系统来作最基本的平台 其它系统在它上面运行 作平台的这个操作系统叫 做 Host OS 为了叙述方便 这里称为 主系统 在主系统上运行虚拟机 在虚拟机内部运行的操作系 统叫做 Guest OS 子系统 或 客户操作系统 由于 Host OS 必须要稳定 且应用程序有独立的内 存空间 所以目前 VMWare 只支持 Linux 和 Windows2000 以上版本的操作系统来做主系统 而 Windows9X 就不行 VMware 工作站 VMware Workstation 是 VMware 公司销售的商业软件产品之一 该工作站软件包 含一个用于英特尔 x86 兼容计算机的虚拟机套装 其允许多个 x86 虚拟机同时被创建和运行 每个虚拟 机实例可以运行其自己的客户机操作系统 如 但不限于 Windows Linux BSD 衍生版本 用简单术 语来描述就是 VMware Workstation 允许一台真实的计算机同时运行多个操作系统 它允许操作系统和 应用程序在一台虚拟机内部运行 虚拟机是独立运行主机操作系统的离散环境 在 VMware Workstation 中 用户可以在一个窗口中加载一台虚拟机 它可以运行自己的操作系统和应用程序 可以在运行于桌 面上的多台虚拟机之间切换 通过一个网络共享虚拟机 例如一个公司局域网 挂起和恢复虚拟机以及 退出虚拟机 这一切不会影响主机操作和任何操作系统以及它正在运行的应用程序 4 VMware Workstation 用于许多不同的目的 它可以用于测试新的操作系统或者应用程序环境 进行跨 平台的软件开发 等等 在本实验中 我们需要在 Linux 操作系统下进行程序设计 同时需要使用 Windows 的一些应用 如 Word Powerpoint 等 而不是频繁地启动和引导计算机 因此 虚拟机软件 VMWare 是我们最佳的选 择 它可以让我们像使用一个 Windows 应用程序一样地使用另一个与 Windows 截然不同的操作系统 4 网络传输协议 众所周知 当今国际互联网 Internet 是建立在 TCP IP 体系架构基础上的 尽管大名鼎鼎的 OSI 体系 架构是 ISO 组织为取代 TCP IP 而指定的 但由于 TCP IP 协议体系出现得较早 并得到了市场的认可和 商业上的驱动 应用非常广泛 目前已成为事实上的国际标准 参照 OSI 体系架构的术语和概念 可以将 TCP IP 体系分为四层结构 从上向下依次是 应用层 传 输层 网络层和网络接口层 如下图所示 应用层 传输层 网络层 网络接口层 其中 网络接口层根据不同的网络物理介质而不同 如同轴电缆 双绞线 光纤 无线等等 一般由 硬件实现 并对上层是透明的 软件开发中一般无需考虑这一层 TCP IP 体系结构中的网络层 传输层和应用层一般是由系统软件实现的 网络层只运行一个协议 即 IP 协议 主要是供传输层协议调用的 程序设计者不能直接调用 因此 一般也无需考虑这一层 TCP IP 体系结构中的传输层运行了两个截然不同的协议 即 TCP 协议和 UDP 协议 它们是为不同的 应用场合而设计的 为了方便应用程序的设计 大多数操作系统都提供了 TCP 和 UDP 的库函数 如 Windows 给出了相应的针对不同传输层协议的 API 函数 可供程序员选择以设计出满足特定需求的网络 应用 这一层是软件开发中需要考虑的 TCP IP 体系结构中的应用层协议就很多了 如 DNS TELNET SMTP HTTP FTP 等等 它们实 际上也是通过调用传输层的 TCP 协议或 UDP 协议 为某些特定的通用性很强的应用而设计的 显然 调 用应用层协议比调用传输层协议更简单 更有针对性 然而 应用层协议一般是针对通用性很强的应用 因此 网络应用程序的开发只能通过调用传输层的 TCP 协议或 UDP 协议来实现系统的网络通信功能 那么 在测试系统的网络应用开发中 究竟是采用 TCP 协议还是 UDP 协议 这里需要进行具体的分析 1 TCP 协议的特点分析 TCP 协议 即传输控制协议 是一个面向连接的 具有可靠传输特性的传输层协议 其主要特点有 端口功能和差错检测 差错检验范围是整个报文段 面向连接 需要建立连接及连接管理 有确认重传 的可靠性机制 数据按序到达 实现了流量控制和拥塞控制 TCP 的首部长度不固定 支持全双工的可 靠传输 可见 TCP 协议比较复杂 其最大的好处就是数据传输的可靠性 尤其是在网络误码率较高的 时候 TCP 协议可以准确无误的把数据送达目的地 它适用于数据量较大 且对数据的正确性要求较高 的场合 如文件传输 远程登录 电子邮件 网页浏览等 但 TCP 协议也因为它的优点而体现出了对应 的缺点 那就是复杂的可靠机制降低了传输的效率 特别是连接管理和确认重传机制等措施 对于数据 量较小 且对实时性要求较高的场合 TCP 协议就不再适用了 这也是为什么 TCP IP 协议体系需要两种 传输层协议的原因 2 UDP 协议的特点分析 UDP 协议 即用户数据报协议 和 TCP 协议相比就简单许多 它不需要建立连接 也不采用可靠的 传输机制 其主要特点有 有端口功能和差错检测 差错检验范围是整个报文段 不建立连接 不确认 不重传 数据无序到达 不进行流量控制和拥塞控制 UDP 的首部长度固定为简短的 8 个字节 在局域 5 网内支持广播传输 可见 简单就意味着高效 UDP 协议省去了复杂的连接管理和确认重传的可靠机制 并且其首部长度仅有 8 个字节 有效数据的占比得以大幅提高 这种简单的机制带来的最大好处就是数 据传输的高效率 非常适用于对实时性要求较高 而对数据正确性要求不高的场合 然而 对于数据量 较大 且对数据的正确性要求较高的场合 UDP 协议的数据无序到达和不可靠传输等缺点 使得其无法 胜任 尤其是网络状况较差的时候更是如此 诚然 TCP 和 UDP 是两个优缺点互补的传输层协议 UDP 协议的优点恰恰就是 TCP 协议的缺点 TCP 协议的优点就正是 UDP 的缺点 对于测试系统而言 数据传输的有效性和正确性是首要的考虑因素 数据错了 传得再快也无济于事 因此 对于测试数据的传输 通常采用的传输协议是 TCP 5 Linux 下的 TCP 网络编程 TCP 协议采用的客户 服务器的通信模式 在 Linux 系统下进行 TCP 网络通讯程序设计的流程如下图 所示 TCP 服务器端首先运行 并不断地监听本地 socket IP 地址和端口号的组合 看是否有远程客户端 发来的连接请求 如果有 则接受连接请求 完成三次握手 TCP 协议的连接管理方式 然后创建一个 新的线程来与该客户端进行交互 同时继续监听是否有其他的客户端发来连接请求 TCP 服务器采用了 TCP 服务器 socket bind listen accept 一直阻塞到客户端一直阻塞到客户端 完成连接为止完成连接为止 TCP 客户端 socket connect send 连接请求连接请求 三次握手三次握手 recv 处理处理 数据数据 send recv 数据数据 send recv 结束通知结束通知 close close pthread create 执行执行 线程线程 函数函数 bind 可省略 由内核自行可省略 由内核自行 绑定一个本地可用的绑定一个本地可用的 IP 地址和端口号地址和端口号 6 多线程的方式 可以实现与多个客户端的并发交互 当 TCP 服务器为某客户端创建的线程执行完毕后 必须关闭线程 以释放其占用的资源 TCP 客户端相对简单一些 只需向 TCP 服务器的 socket 发出连接请求 一旦服务器端接受并连接成 功后 即可与服务端进行交互 完成数据的收发 在本实验中 ARM 模块将作为 TCP 服务器端 PC 将作为 TCP 客户端来访问 ARM 模块 并与之进 行数据的传输 六 实验步骤 1 在 Windows 操作系统下找到 VMware 应用程序图标 点击进入虚拟机 并启动标签名为 clone of 6 的虚拟机 即运行 Linux 操作系统 Fedora 6 如果 VMware 窗口中没有标签名为 clone of 6 的虚拟机 则点击菜单项 文件 打开 找到 C clone of 6 目录下的 clone of f6 vmx 文件 并打开之 即可加 载该虚拟机 2 源程序的编写 本实验中 ARM 模板将作为服务器端 ARM Linux 软件开发所需的文件有 zImage即 ARM Linux 系统的内核映像 Image 的压缩文档 关于 ARM Linux 系统内 核的配置 裁剪和编译不是本实验的内容 zImage 是现成可用的 initrd gz即 ARM Linux 系统的根文件系统 initrd 的压缩文档 initrd 即 initial RAM disk 的缩写 是 Linux 在系统引导过程中挂载的一个临时根文件系统 用来 支持两阶段的引导过程 initrd 文件中包含了各种可执行程序和驱动程序 它 们可以用来挂载实际的根文件系统 然后再将这个 initrd RAM disk 卸载 并 释放内存 但在嵌入式 Linux 系统中 initrd 往往直接作为最终的根文件系统 在本实验中 需要将编译好的可执行程序加入到 initrd 中 需要对其进行修改 和重新压缩 server c未完成的 ARM Linux 下的服务器实验程序 该程序已提供主体框架 实验中 需要编写缺失的部分 以实现与上位机 PC 机 客户端程序之间的数据通讯 my route hserver c 中网络参数配置所需的头文件 无需编辑 Makefile编译 server c 的所需的编译信息文件 纯文本文件 Makefile 文件相当于编 译行为的指导文件 即告诉编译器如何编译 其中描述了相应的 C 程序文件 的编译 链接等规则 其中包括 哪些源文件需要编译以及如何编译 需要 创建哪些库文件以及如何创建这些库文件 如何产生我们想要的可执行文件 等等 首先 在 VMware 中 Fedora 6 系统的 home 目录下新建一个目录 并将 Windows 下的 initrd gz server c my route h Makefile 四个文件拷贝到其中 然后在 Fedora 6 系统下双击 server c 自动打开一个文本编辑器 gedit 接着进行程序代码的编写 也 可用 Windows 下的任意的文本编辑器来编写源程序 如下图 写好后再拷入 Fedora 6 系统下的相应目录 中 相关的 Linux 库函数用法可参见附录 7 图 server c 程序编写 3 Makefile 文件的编辑 鼠标双击打开 Makefile 文件 做如下修改 EXEC server SOURCE server c 4 源程序的编译 由于该程序运行的目标平台是 ARM 模板 而非 PC 机 因此这里需要使用交叉编译器 已经配置好了 在 VMware 的 Fedora 6 系统下打开一个终端窗口 进行命令行的操作模式 在光标后输入命令 cd home 新建的目录名切换到新建的目录下 接着输入命令 make系统将按照当前目录下的 Makefile 中的信息对相应的源程序进行编译 编译正确后 会在当前目录下生成一个可执行文件 server 注意 Linux 的可执行文件没有后缀名 5 ARM Linux 根文件系统 initrd 的修改与重压缩 双击 initrd 的压缩文档 initrd gz 解压至当前目录 在终端窗口下输入命令 mount o loop initrd mnt initrd 挂载根文件系统 initrd 至目录 mnt initrd 下 在文件浏览器中将新生成的可执行文件 server 拷贝到 mnt initrd sbin 下 进入 mnt initrd etc init d 目录 找启动脚本文件 rcS 点击右键选择脚本编辑器 KDevelop 打开之 在最后追加如下两行命令 然后保存 这使得 ARM Linux 系统启动后自动运行 server 程序文件 cd sbin server 在终端窗口下输入命令 umount mnt initrd卸载根文件系统 initrd 在终端窗口下输入命令 gzip 9 initrd压缩根文件系统 initrd 为 initrd gz 至此 ARM Linux 的程序设计工作已完成 将新构建的 initrd gz 拷贝到 Windows 下的 zImage 所在的 调试目录下 6 上位机与下位机的 TCP 网络通讯测试 步骤如下 1 连接实验平台 用串口线和交叉网线将实验平台的 ARM 模块与 PC 机的对应接口连接 然后接 通实验平台的电源线 2 打开超级终端 如下图所示 8 注 如果 Windows 系统中没有超级终端 则可使用 调试 文件夹里的 hypertrm exe 首次设置超级终端将会出现如下图所示的对话框 点击 确定 3 设置超级终端 首次设置超级终端将会出现如下图所示的对话框 输入任意的区号 如 028 点击 确定 接着出现如下图所示的对话框 直接点击 确定 9 接着出现如下图所示的对话框 输入任意名称 如 9200 点击 确定 接着出现如下图所示的对话框 选择串口 默认为 COM1 直接点击 确定 接着出现如下图所示的对话框 设置属性 请按下图设置为 115200 8 无 1 无 点击 确定 10 至此 超级终端的设置完毕 注 如果出现下图所示的警告 是因为虚拟机正在使用串口 找到虚拟机窗口的右下角的串口图标 如下图所示 鼠标右键点击该图标 选择 断开连接 4 实验平台通电或按下 ARM 板上的复位按钮 可以看到 ARM 板上的指示灯闪亮 此时 超级终 端中将显示 ARM 的启动过程 说明 超级终端作为 ARM 的控制台 起到键盘和显示器的作用 在时间提示出现时马上按下回车键 进入 Uboot 命令行模式 如下所示 说明 Uboot 类似于 PC 机 的 BIOS 程序 用于引导和启动 ARM 系统 并提供了一些简单的操作命令 11 5 Uboot 网络参数的设置 注意 PC 机必须和 ARM 模块在一个网段 IP 地址的前三个数相同 最后一个数不同 首先 PC 机的 IP 地址可在 Windows 桌面的网上邻居的属性中设置 然后 在超级终端窗口的 Uboot 命令行中输入如下命令 printenv 查看当前的 Uboot 环境参数的设置情况 setenv ipaddr IP 地址 设置 ARM 模块的 Uboot 系统的 IP 地址 要求与 PC 机在同一网段 且与 server c 中设置的 IP 地址不同 setenv serverip 服务器 IP 地址 服务器 IP 地址就是 PC 机本身的 IP 地址 6 在 PC 上运行一个 TFTP 服务器程序 以便用 TFTP 协议与 ARM 模块上的 Uboot 进行网络通讯 本实验采用的是 TFTPD32 运行 TFTPD32 后如下图所示 点击 Browse 设置当前目录为 文件 zImage 和 initrd gz 所在的目录 Server interfaces 为 PC 机 与 ARM 模块连接的网口的 IP 12 7 输入命令 区分大小写 tftp 20008000 zImage 传输 Linux 内核到 SDRAM 的 20008000 地址 8 输入命令 tftp 20700000 initrd gz 传输 Linux 文件系统到 SDRAM 的 20700000 地址 9 输入命 go 20008000 从内核的起始地址 20008000 开始运行 ARM Linux 系统 10 运行上位机测试程序 client exe 输入 ARM 模板的 IP 地址 在 ARM Linux 程序 server c 中设 置的 点击 连接 与 ARM 模块建立 TCP 连接 然后发送字符串 验证接收到的字符串是否正确 如 下图所示 同时 在超级终端中观察 ARM 模块显示的信息 七 思考题 1 本实验中为什么要使用交叉网线 而不是通常所用的直连网线 答 因为直连网线一般只在将交换机或 HUB 与路由器连接或计算机 包括服务器和工作站 与交换机或 HUB 连接时使用 而交叉网线主要用于同类端口之间的连接 比如 两台 PC 直接相连 网卡对网卡 相 连时使用 2 在编译 server c 时 除了用 make 命令 还可以用什么命令 还可以使用 cc server c 进行编译 3 是否可以发送中文 不可以 arm 中无法识别显示中文字符 13 附 录 实验相关的 Linux 库函数 memset 将一段内存空间填入某值 头文件 include 定义函数 void memset void s int c size t n 函数说明 memset 会将参数 s 所指的内存区域前 n 个字节以参数 c 填入 然后返回指向 s 的指针 在编写程序时 若需要将某一数组作初始化 memset 会相当方便 返回值 返回指向 s 的指针 附加说明 参数 c 虽声明为 int 但必须是 unsigned char 所以范围在 0 到 255 之间 范例 include main char s 30 memset s A sizeof s s 30 0 printf s n s 执行 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA recv 经 socket 接收数据 头文件 include include 定义函数 int recv int s void buf int len unsigned int flags 14 函数说明 recv 用来接收远端主机经 s 指定的 socket 传来的数据 并把数据存到由参数 buf 指向的内存空间 参 数 s 为已建立好连接的 socket 参数 len 为可接收数据的最大长度 参数 flags 一般设 0 其它数值定义如下 MSG OOB 接收以 out of band 送出的数据 接收带外数据 MSG PEEK 返回来的数据并不会在系统内删除 如果再调用 recv 会返回相同的数据内容 MSG WAITALL 强迫接收到 len 大小的数据后才能返回 除非有错误或信号产生 MSG NOSIGNAL 表示不愿被 SIGPIPE 信号中断 成功则返回接收到的字符数 失败返回 1 错误 原因存于 errno 中 MSG DONTWAIT 本操作设置为非阻塞方式 错误代码 EBADF 参数 s 非合法的 socket 处理代码 EFAULT 参数中有一指针指向无法存取的内存空间 ENOTSOCK 参数 s 为一文件描述词 非 socket EINTR 被信号所中断 EAGAIN 此动作会令进程阻断 但参数 s 的 socket 为不可阻断 ENOBUFS 系统的缓冲内存不足 ENOMEM 核心内存不足 EINVAL 传给系统调用的参数不正确 范例 include include include include include define PORT 1234 服务器的端口号 define MAXSOCKFD 10 最大连接数 main int sockfd newsockfd is connected MAXSOCKFD fd struct sockaddr in servaddr int addr len sizeof struct sockaddr in fd set readfds char buffer 256 char msg Welcome to server if sockfd socket AF INET SOCK STREAM 0 0 perror socket exit 1 bzero servaddr sin family AF INET 15 servaddr sin port htons PORT servaddr sin addr s addr htonl INADDR ANY INADDR ANY 表示本地任意可用的 IP 地址 if bind sockfd exit 1 if listen sockfd 3 0 perror listen exit 1 for fd 0 fd MAXSOCKFD fd 清除连接状态标志 is connected fd 0 while 1 FD ZERO FD SET sockfd for fd 0 fd MAXSOCKFD fd if is connected fd FD SET fd if select MAXSOCKFD for fd 0 fd MAXSOCKFD fd 判断是否有新连接或新信息进来 if FD ISSET fd write newsockfd msg sizeof msg is connected newsockfd 1 printf Connect from s n inet ntoa addr sin addr else bzero buffer sizeof buffer if read fd buffer sizeof buffer 0 printf connect closed n is connected fd 0 close fd else printf s buffer 16 执行 listen connect from 127 0 0 1 hi

温馨提示

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

评论

0/150

提交评论