

下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于 ARM-Linux 的网络通讯设计实验下位机实验部分一 实验目的1. 了解 ARM-Linux 操作系统的基本构成。2. 掌握 ARM-Linux 下的网络通讯程序的设计与编译。3. 掌握 ARM-Linux 的文件系统的修改及构建方法。二实验内容下位机程序设计。 在 Linux 环境下用 C 语言编写基于 TCP 协议的数据收发的 下位机程序,作为服务器端,可实现从上位机(客户端接收数据并回传给上位机。然后 对程序进行交叉编译,最后修改及构建 ARM-Linux 的文件系统,使之能在 ARM 模块 上运行。三预备知识1. C 语言。2. TCP 网络传输协议的原理及工作方式。四实验设备
2、与工具硬件:测试技术与嵌入式系统综合实践平台,微型计算机。软件:Windows 操作系统,超级终端,虚拟机软件 VMware(预装 Linux 操作系统Fedora 6 及 ARM-Linux 开发环境。五.实验原理概述1. ARM 实验模块ARM(Adva need RISC Mach in es,既可以认为是一个公司的名字,也可以认为是对微处理器的通称,还可以认为是一种技术的名字。ARM 处理器是一个 32 位元精简 指令集(RISC 处理器架构,其广泛地使用在许多嵌入式系统设计。和 In tel 的 x86 为 代表的复杂指令集(RISC 处理器相比,ARM 的特点是:体积小、低功耗、低
3、成本、高 性能;支持Thumb(16 位/ARM(32 位双指令集,能很好的兼容 8 位/16 位器件;大量使用 寄存器,指令长度固定,指令执行速度快;大多数数据操作都在寄存器中完成;寻址方 式灵活简单,执行效率高;外围接口丰富,包含有如 UART、USB、MCI、SPI、以太 网接口等。ARM处理器可以很好地支持 Linux、VxWorks、PSOS 等嵌入式操作系,成为嵌入式系统处理器的主流,广泛应用于平板电脑、智能手机、手持/便携式智能 设备等。本实验模块采用了 ATMEL 公司推出的工业级的 ARM9 处理器 A T91RM9200,配置了 16MB 的 SDRAM ,4MB 的 FL
4、ASH ,USB Host 端口,RS232 接口,以及以太网接口等。实验模块的硬件框图如下其中,SDRAM 提供 ARM-Linux 系统运行所需放入内存,FLASH 作为非易失性的存储器,用于存放 ARM-Linux 系统的引导程序 Uboot 以及 ARM-Linux 的内核镜像和文件系统镜像。A T91RM9200 自带了以太网接口的 MAC 层,设计者可根据具 体的物理传输介质选用相应的物理层芯片,本实验模块选用的是针对双绞线传输介 质的物理层芯片 DM9161。AT91RM9200 自带的 UART(通用异步收发器接口并不 支持计算机的RS232 电平,因此,本实验模块采用了 MA
5、X232 芯片来实现 UART 接 口到 RS232 接口的转换。另外,A T91RM9200 自带了 USB2.0 全速(Full Speed 接口 , 可以直接引出。ARM实验模块采用了四层 PCB布版设计,实物图如下所示Eihemet _代Ethe2. ARM-Linux 交叉编译环境在本实验中,我们需要设计程序并在 ARM 上运行,但由于受到 ARM 处理器资 源 (包括人机接口、存储器容量等的限制,我们无法在 ARM 上编写源程序以及将其 编译成目标程序,因此,我们需要在 PC 机平台上编写并编译能在ARM 上运行的目标程序。在一种计算机环境中运行的编译程序,能编译出在另外一种环境下
6、运行的代码,这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可 执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构 (Architecture、操作系统(Operating System。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来 说,我们常说的 x86 Linux平台实际上是 In tel x86体系结构和 Li nux for x86操作系统 的统称;而 x86 WinNT 平台实际上是 Intel x86 体系结构和 Windows NT for x86 操作 系统的简称。交叉编译这个概念的出现和流行
7、是和嵌入式系统的广泛发展同步的。我们常用 的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如 C 代 码编译(compile 成计算机可以识别和执行的二进制代码。比如,我们在 Windows 平 台上,可使用 Visual C+开发环境,编写程序并编译成可执行程序。这种方式下,我们 使用 PC 平台上的 Windows 工具开发针对 Windows 本身的可执行程序,这种编译过 程称为 NativeCompilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发 时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平 台其一般的静态存储空
8、间大概是 16 到 32MB,而 CPU 的主频大概在 100MHz 到 500MHz 之间。这种情况下,在 ARM 平台上进行本机编译就不太可能了,这是因为一 般的编译工具链(CompilationTool Cha in 需要很大的存储空间,并需要很强的 CPU 运 算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们 就可以在 CPU 能力很强、存储空间足够的主机平台上(比如 PC 上编译出针对其他 平台的可执行程序。要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(CrossCompilation Tool Chai n,然后用这个交叉编译工具链编译我们
9、的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下: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 简介通常,一台计算机安装一个常用的操作系统。而当我们需要使用多个操作系统,而硬件平台有限的时候,就希望在同
10、一台计算机上使用多个操作系统。往往采用的 方法是分别安装它们,然后采用 多启动”的方式,分别引导计算机进入所需的操作系 统。尽管这种方式可以实现在同一台计算机上使用多个操作系统,但多启动系统在 一个时刻只能运行一个操作系统,想要切换操作系统时必须重新启动机器,重新引导 进入所需的操作系统,这给用户的使用带来了不便。VMWare 是一个 虚拟机”软件。它使用户可以在一台计算机上同时运行二个或更多的操作系统,如 Windows2000、WindowsXP、DOS、LINUX 等系统。与 多启 动”系统相比,VMWare 采用了完全不同的概念,是真正的 同时”运行,多个操作系统 在主系统的平台上,就
11、象 Word / Excel 那样,作为一个标准的 Windows 应用程序,可以 方便地切换。VMWare 需要一个操作系统来作最基本的平台,其它系统在它上面运行。作平 台的这个操作系统叫做 Host OS,为了叙述方便,这里称为 主系统”在主系统上运 行虚拟机,在虚拟机内部运行的操作系统叫做 Guest OS(子系统”或 客户操作系 统”由于 Host OS必须要稳定,且应用程序有独立的内存空间,所以目前 VMWare 只支持 Linux 和Windows2000 以上版本的操作系统来做主系统,而 Windows9X 就不 行。VMware 工作站(VMware Workstation 是
12、 VMware 公司销售的商业软件产品之一。该工作站软件包含一个用于英特尔 x86 兼容计算机的虚拟机套装,其允许多个 x86虚拟机同时被创建和运行。每个虚拟机实例可以运行其自己的客户机操作系统 如(但不限于 Windows、Linux、BSD 衍生版本。用简单术语来描述就是,VMware Workstation 允许一台真实的计算机同时运行多个操作系统。它允许操作系统和应 用程序在一台虚拟机内部运行。虚拟机是独立运行主机操作系统的离散环境。在 VMware Workstation 中,用户可以在一个窗口中加载一台虚拟机,它可以运行自己的 操作系统和应用程序;可以在运行于桌面上的多台虚拟机之间
13、切换,通过一个网络共 享虚拟机(例如一个公司局域网,挂起和恢复虚拟机以及退出虚拟机。这一切不会影 响主机操作和任何操作系统以及它正在运行的应用程序。VMware Workstation 用于许多不同的目的。它可以用于测试新的操作系统或者 应用程序环境,进行跨平台的软件开发,等等在本实验中,我们需要在 Linux 操作系统下进行程序设计,同时需要使用Windows 的一些应用(如 Word、 Powerpoint 等,而不是频繁地启动和引导计算机。 因 此,虚拟机软件 VMWare 是我们最佳的选择,它可以让我们像使用一个 Windows 应 用程序一样地使用另一个与 Windows 截然不同的
14、操作系统。4.网络传输协议众所周知,当今国际互联网 In ternet 是建立在 TCP/IP 体系架构基础上的,尽管大 名鼎鼎的 OSI 体系架构是 ISO 组织为取代 TCP/IP 而指定的但由于 TCP/IP 协议体 系出现得较早,并得到了市场的认可和商业上的驱动,应用非常广泛,目前已成为事实 上的国际标准。参照 OSI 体系架构的术语和概念,可以将 TCP/IP 体系分为四层结构,从上向下其中,网络接口层根据不同的网络物理介质而不同,如同轴电缆、双绞线、光 纤、无线等等,一般由硬件实现,并对上层是透明的,软件开发中一般无需考虑这一 层。TCP/IP 体系结构中的网络层、传输层和应用层一
15、般是由系统软件实现的。网 络层只运行一个协议,即 IP 协议,主要是供传输层协议调用的,程序设计者不能直接 调用,因此,一般也无需考虑这一层。TCP/IP 体系结构中的传输层运行了两个截然不同的协议,即 TCP 协议和 UDP 协议,它们是为不同的应用场合而设计的。为了方便应用程序的设计,大多数操作系 统都提供了 TCP 和 UDP 的库函数,如 Windows 给出了相应的针对不同传输层协议 的 API 函数,可供程序员选择以设计出满足特定需求的网络应用。这一层是软件开 发中需要考虑的。TCP/IP 体系结构中的应用层协议就很多了,如 DNS、TELNET、SMTP、HTTP、FTP 等等,
16、它们实际上也是通过调用传输层的 TCP 协议或 UDP 协议,为某些 特定的通用性很强的应用而设计的。显然,调用应用层协议比调用传输层协议更简 单、更有针对性。然而,应用层协议一般是针对通用性很强的应用。因此,网络应用程序的开发只能通过调用传输层的 TCP 协议或 UDP 协议来实现 系统的网络通信功能。那么,在测试系统的网络应用开发中,究竟是采用 TCP 协议还 是UDP 协议,这里需要进行具体的分析。1TCP 协议的特点分析TCP 协议(即传输控制协议是一个面向连接的,具有可靠传输特性的传输层协议, 其主要特点有:端口功能和差错检测;差错检验范围是整个报文段;面向连接(需要建 立连接及连接
17、管理;有确认重传的可靠性机制,数据按序到达;实现了流量控制和拥塞 控制;TCP 的首部长度不固定;支持全双工的可靠传输。可见,TCP 协议比较复杂。其 最大的好处就是数据传输的可靠性,尤其是在网络误码率较高的时候,TCP 协议可以 准确无误的把数据送达目的地。它适用于数据量较大、且对数据的正确性要求较高 的场合,如文件传输、远程登录、电子邮件、网页浏览等。但TCP 协议也因为它的优点而体现出了对应的缺点,那就是复杂的可靠机制降低了传输的效率,特别是连接 管理和确认重传机制等措施。对于数据量较小、且对实时性要求较高的场合,TCP协议就不再适用了。这也是为什么 TCP/IP 协议体系需要两种传输层
18、协议的原因。2UDP 协议的特点分析UDP 协议(即用户数据报协议和 TCP 协议相比就简单许多,它不需要建立连接,也不采用可靠的传输机制,其主要特点有:有端口功能和差错检测;差错检验范围是整 个报文段;不建立连接、不确认,不重传,数据无序到达;不进行流量控制和拥塞控 制;UDP 的首部长度固定为简短的 8 个字节;在局域网内支持广播传输。可见,简单就 意味着高效,UDP 协议省去了复杂的连接管理和确认重传的可靠机制,并且其首部长 度仅有 8 个字节,有效数据的占比得以大幅提高。这种简单的机制带来的最大好处 就是数据传输的高效率,非常适用于对实时性要求较高、而对数据正确性要求不高的场合。然而,
19、对于数据量较大、且对数据的正确性要求较高的场合 ,UDP 协议的数据无序到达和不可靠传输等缺点,使得其无法胜任,尤其是网络状况较差的时候更是如此。诚然,TCP 和 UDP 是两个优缺点互补的传输层协议,UDP 协议的优点恰恰就是 TCP协议的缺点,TCP 协议的优点就正是 UDP 的缺点。对于测试系统而言,数据传输的有效性和正确性是首要的考虑因素,数据错了,传 得再快也无济于事。因此,对于测试数据的传输,通常采用的传输协议是 TCP。5. Linux 下的 TCP 网络编程TCP 协议采用的客户-服务器的通信模式。在 Linux 系统下进行 TCP 网络通讯程序设计的流程如下图所示TCP 服务
20、器端首先运行,并不断地监听本地 socket (IP 地址和端口号的组合,看 是否有远程客户端发来的连接请求。如果有,则接受连接请求,完成三次握手(TCP 协 议的连接管理方式,然后创建一个新的线程来与该客户端进行交互,同时继续监听是 否有其他的客户端发来连接请求。TCP 服务器采用了多线程的方式,可以实现与多 个客户端的并发交互。当 TCP 服务器为某客户端创建的线程执行完毕后,必须关闭 线程,以释放其占用的资源。TCP 服务器IP 地址和端口号TCP 客户端相对简单一些,只需向 TCP 服务器的 socket 发出连接请求,一旦服务 器端接受并连接成功后,即可与服务端进行交互,完成数据的收
21、发。在本实验中,ARM 模块将作为 TCP 服务器端,PC 将作为 TCP 客户端来访问ARM 模块,并与之进行数据的传输。t#IW* I ILJLISCI *rrp*户MH六实验步骤1. 在 Windows 操作系统下找到 VMware 应用程序图标,点击进入虚拟机,并启动 标签名为“cloneof(的虚拟机,即运行 Linux 操作系统 Fedora 6 如果 VMware 窗口中没有标签名为“clone of 6 勺虚拟机,则点击菜单项 文件”打开”找到 C:cloneof 6 目录下的 clone of f6.vmx 文件,并打开之,即可加载该虚拟机。2. 源程序的编写。本实验中,AR
22、M 模板将作为服务器端,ARM_Linux 软件开发 所需的文件有:zlmage 即 ARM_Linux 系统的内核映像 Image 的压缩文档。关于 ARM_Linux系统内核的配置、裁剪和编译不是本实验的内容,zImage 是现成可用的。initrd.gz 即 ARM_Linux 系统的根文件系统 initrd 的压缩文档。initrd(即 initialRAM disk的缩写,是Linux在系统引导过程中挂载的一个临时根文件系统,用来支持两 阶段的引导过程。 initrd文件中包含了各种可执行程序和驱动程序,它们可以 用来挂载实际的根文件系统,然后再将这个initrd RAM disk
23、卸载,并释放内存。 但在嵌入式 Linux 系统中,initrd 往往直接作为最终的根文件系统。在本实验中: 需要将编译好的可执行程序加入到 initrd 中,需要对其进行修改和重新压缩。server.c 未完成的 ARM_Linux 下的服务器实验程序,该程序已提供主体框架,实 验中需要编写缺失的部分,以实现与上位机(PC 机客户端程序之间的数据通讯。my_route.h server.c 中网络参数配置所需的头文件,无需编辑Makefile 编译 server.c 的所需的编译信息文件(纯文本文件。Makefile 文件相当于编译行为的指导文件,即告诉编译器如何编译,其中描述了相应的 C
24、程序文件的编译、链接等规则,其中包括:哪些源文件需要编译以及如何编译,需要创建哪些库文件以及如何创建这些库文件,如何产生我们想要的可执行文件等等。首先,在 VMware 中 Fedora 6 系统的/home 目录下新建一个目录,并将 Windows下的 initrd.gz、server.c my_route.h、Makefile 四个文件拷贝到其中。然后在Fedora 6系统下双击server.c自动打开一个文本编辑器gedit,接着进行 程序代码的编写(也可用 Windows 下的任意的文本编辑器来编写源程序(如下图,写 好后再拷入 Fedora 6 系统下的相应目录中。相关的 Linux
25、 库函数用法可参见附录。while() Ifprintf (stdErr# n Waiting for PC client , , An) ; /fflush (stdout;ireireu ( rbuf ffCj-BSIZE) ; /clear receive bufferrecv( tsockfdrrbuf,BSI2Ef) ;/ receive data frcrr. clientprincf ( r; R亡二亡丄丁亡:毛二rbuff ; f flush; /Display Lhe received scring5end( tsockfd, rbufffstrlen (rbuff/send
26、 back: to client图 server.c 程序编写3. Makefile 文件的编辑。鼠标双击打开 Makefile 文件,做如下修改:EXEC = serverSOURCE = server.c4. 源程序的编译。由于该程序运行的目标平台是ARM 模板,而非 PC 机,因此这里需要使用交叉编译器(已经配置好了。在 VMware 的 Fedora 6 系统下打开一个终 端窗口,进行命令行的操作模式。在光标后输入命令:cd /home 新建的目录名切换到新建的目录下接着输入命令:make 系统将按照当前目录下的 Makefile 中的信息对相应的源程序进行编译。编译正确后,会在当前目
27、录下生成一个可执行文件 serve。(注意: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 打开之,在最后
28、追加如下两行命令,然后保存。这使得 ARM_Linux 系统启 动后自动运行 server 程序文件。cd /sbi n./server在终端窗口下输入命令:umount /mnt/initrd 卸载根文件系统 initrd在终端窗口下输入命令gzip -9 initrd 压缩根文件系统 initrd 为 initrd.gz至此,ARM-Linux 的程序设计工作已完成,将新构建的 initrd.gz 拷贝到 Windows 下的 zImage 所在的调试目录下。6.上位机与下位机的 TCP 网络通讯测试。步骤如下:(1 连接实验平台。用串口线和交叉网线将实验平台的ARM 模块与 PC 机的对
29、应接口连接,然后接通实验平台的电源线。(2 打开超级终端,如下图所示帮助和支持迅)【注】如果 Windows 系统中没有超级终端,则可使用调试”文件夹里的hypertrm.exe。首次设置超级终端将会出现如下图所示的对话框,点击确定设定程序访问和默认值Protel 99 SEDr. CON宽带认证客户请漫游Windows UF函命提不符縛板讯 步 宇通同写JQ3程序0)文裆迦设置搜索Mi crosoft Offi ceNti on al Insr-uffltnts CVINational InstrumentsFrotel 99 SE金山词霸2006附牛网络安装向导网貉连接 无线网络安装向辱新
30、建连接向导旺程車査i至接注销yuz关闭计算机(U) .戳认氏丄皿七程序?戳认氏丄皿七程序?熬翳您将恥W迢作桶认程序.要遠要再同遠个间题顶工_s I-! - rFT- rr - rr- b L = - n 1L2- er l - *r -i -sTsrr(3 设置超级终端首次设置超级终端将会出现如下图所示的对话框,输入任意的区号(如 028 点击确定”接着出现如下图所示的对话框,直接点击确定默认Telnet程序?匸it不要再同这亍購i皋丿I.环接着出现如下图所示的对话框,输入任意名称,如 9200。点击 确定接着出现如下图所示的对话框,选择串口(默认为 COM1。直接点击 确定輸入恃按电话的谦汕
31、信息:接着出现如下图所示的对话框,设置属性,请按下图设置为:115200,8 无,1,无。点至此,超级终端的设置完毕连接到区国家哋区)区号:电话号码E):连接时使用:击确定【注】如果出现下图所示的警告,是因为虚拟机正在使用串口找到虚拟机窗口的右下角的串口图标,如下图所示。鼠标右键点击该图标,选择 断开连接”。(4 实验平台通电或按下 ARM 板上的复位按钮,可以看到 ARM 板上的指示灯闪 亮。此时,超级终端中将显示 ARM 的启动过程(说明:超级终端作为 ARM 的控制台,起到键盘和显示器的作用。在时间提示出现时马上按下回车键,进入 Uboot 命令行模式,如下所示。(说明:Uboot 类似
32、于 PC 机的 BIOS 程序,用于引导和启动 ARM 系统,并提供了一些简单 的操作命令(5Uboot 网络参数的设置。注意:PC 机必须和 ARM 模块在一个网段(IP 地址的 前三个数相同,最后一个数不同首先,PC 机的 IP 地址可在 Windows 桌面的网上邻居的属性中设置。然后,在超级终端窗口的 Uboot 命令行中输入如下命令:printenv (查看当前的 Uboot 环境参数的设置情况setenv ipaddr IP 地址(设置 ARM 模块的 Uboot 系统的 IP 地址,要求与 PC 机在同 一网段,且与server.c 中设置的 IP 地址不同setenv serv
33、erip 月服务器 IP 地址(服务器 IP 地址就是 PC 机本身的 IP 地址(6 在 PC 上运行一个 TFTP 服务器程序,以便用 TFTP 协议与 ARM 模块上的Uboot 进行网络通讯,本实验采用的是 TFTPD32。运行 TFTPD32 后如下图所示。点击“Browse 设置当前目录为文件 zlmage 和 initrd.gz 所在的目录,“Server interfaces 为” PC 机与 ARM 模块连接的网口的 IP。(7 输入命令(区分大小写:tftp 20008000 zImage 传输 Linux 内核到 SDRAM 的 20008000 地址。(8 输入命令:t
34、ftp 20700000 initrd.gz,传输 Linux 文件系统到 SDRAM 的 20700000 地址。(9 输入命:go 20008000 从内核的起始地址 20008000 开始运行 ARM_Linux 系统。(10 运行上位机测试程序 client.exe 输入 ARM 模板的 IP 地址(在 ARM_Linux 程 序server.c 中设置的,点击 连接”与 ARM 模块建立 TCP 连接,然后发送字符串,验证 接收到的字符串是否正确,如下图所示。云ARI实建上位机测试程序退岀同时,在超级终端中观祭 ARM 模块显示的信息。七.思考题1. 本实验中为什么要使用交叉网线,而
35、不是通常所用的直连网线?答:因为直连网线一般只在将交换机或 HUB 与路由器连接或计算机(包括服务 器和工作站与交换机或HUB 连接时使用,而交叉网线主要用于同类端口之间的连接,比如,两台 PC 直接 相连(网卡对网卡相连时使用。2. 在编译 server.c 时,除了用 make 命令,还可以用什么命令?还可以使用cc server.c 进行编译。3. 是否可以发送中文?不可以,arm 中无法识别显示中文字符。附录实验相关的 Linux 库函数:回区I发送memset 将一段内存空间填入某值头文件#i nclude 定义函数void * memset ( void * s , int c,
36、size_t n ;函数说明memset (会将参数 s 所指的内存区域前 n 个字节以参数 c 填入,然后返回指向 s 的指针。在编写程序时,若需要将某一数组作初始化,memset (会相当方便。返回值返回指向 s 的指针。附加说明参数 c 虽声明为 int ,但必须是 unsigned char 所以范围在 0 到 255 之间。范例#i nclude main (char s30;memset ( s, A, sizeof ( s ;s30 = 0;printf ( %sn, s ;执行AAAAAAAAAAAAAAAAAAAAAAAAAAAAAArecv(经 socket 接收数据头文件
37、#in elude #in elude 定义函数int recv ( int s, void * buf, i nt len, un sig ned int flags ;函数说明recv (用来接收远端主机经 s 指定的 socket 传来的数据,并把数据存到由参数 buf指向的内存空间 渗数 s 为已建立好连接的 socket 参数 len 为可接收数据的最大 长度。参数flags 一般设 0,其它数值定义如下:MSG_OOB 接收以 out-of-band 送出的数据(接收带外数据。MSG_PEEK 返回来的数据并不会在系统内删除,如果再调用 recv (会返回相同 的数据内容。MSG_
38、WAITALL 强迫接收到 len 大小的数据后才能返回,除非有错误 或信号产生。MSG_NOSIGNAL 表示不愿被 SIGPIPE 信号中断,成功则返回接收到的字符数 失败返回-1,错误原因存于 errno 中。MSG_DONTWAIT 本操作设置为非阻塞方式错误代码EBADF 参数 s 非合法的 socket 处理代码EFAULT 参数中有一指针指向无法存取的内存空间ENOTSOCK 参数 s 为一文件描述词,非 socket。EINTR 被信号所中断EAGAIN 此动作会令进程阻断,但参数 s 的 socket 为不可阻断ENOBUFS 系统的缓冲内存不足。ENOMEM 核心内存不足E
39、INVAL 传给系统调用的参数不正确。范例#in elude #in elude #in clude #in clude #in clude #defi ne PORT 1234 /服务器的端口号#defi ne MAXSOCKFD 10 / 最大连接数main (int sockfd, n ewsockfd, is_co nn ectedMAXSOCKFD, fd;struct sockaddr_i n servaddr;intaddr_le=sizeof ( struct sockaddr_i n ;fd_set readfds;char buffer256;char msg= :Welc
40、ome to server!;if ( ( sockfd =:socket ( AF_INET, SOCK_STREAM, 0 0perror (“ socket ” ;exit ( 1 ;bzero ( & servaddr, sizeof (servaddr ;servaddr.s in _family = AF_INET;servaddr.s in _port = htons ( PORT ;servaddr.sin_addr.s_addr = htonl ( INADDR_ANY ; INADDR_ANY 表示本地任意可用的 IP 地址 if ( bind ( sockfd,
41、& servaddr, sizeof (servaddr 0perror ( c onn ect;exit ( 1 ;if ( liste n ( sockfd, 3 0perror ( liste n;exit ( 1 ;for ( fd = 0; fd MAXSOCKFD; fd + / 清除连接状态标志is_conn ectedfd = 0;while ( 1FD_ZERO ( & readfds ;FD_SET ( sockfd, & readfds ;for ( fd = 0; fd MAXSOCKFD; fd +if ( is_conn ectedfdFD_
42、SET ( fd, & readfds ;if ( !select ( MAXSOCKFD, & readfds, NULL, NULL, NULL con tin ue;for ( fd = 0; fd MAXSOCKFD; fd + /判断是否有新连接或新信息进来 if (FD_ISSET( fd, & readfdsif ( sockfd = fdif ( ( newsockfd = accept ( sockfd, &addr, &addr_len 0 perror (“ acceptfailed! ” ;write ( n ewsockfd,
43、msg, sizeof ( msg ;is_c onn ected newsockfd = 1;printf (“ Connec n”,inet_ntoa ( addr.sin_addr ;elsebzero ( buffer, sizeof ( buffer ;if ( read ( fd, buffer, sizeof ( buffer = 0printf (“ connect closed.is_conn ectedfd = 0;close ( fd ; 执行 $ ./listen connect from hi I am client connected closed. send(经 socket 传送数据) 头文件 #i nclude #i nclude sys/socket.h 症义 函数 int send ( int s, const void * msg, int len, unsigned int falgs ;函数说明 send (用来 将数据由指定的 socket 传
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老年痴呆护理诊断及措施
- 公司组织安全培训新闻稿课件
- 职业技能实训《财务管理》形成性考核
- 《让法律保护你》课件
- 《蝴蝶找家》资源包课件
- 汽配月度工作总结
- 事故安全培训教学课件
- 教务年度总结汇报
- 公司级别安全培训内容课件
- 手术室年终总结2025
- 国企职工劳务合同协议
- GB/T 37507-2025项目、项目群和项目组合管理项目管理指南
- 商品检验试题及答案
- 骨科危重患者的急救及护理
- 2025年邮政社招笔试试题及答案
- 水资源保护课件
- 2025年中国移动初级解决方案经理学习考试题库大全-上(单选题)
- 重难点梳理写作指导(讲义)-人教PEP版英语六年级上册
- 临床用血管理制度课件
- 2024年钛行业发展研究报告
- 《人工智能通识教程》(第2版)教学大纲
评论
0/150
提交评论