应用程序开发课件.ppt

上传人(卖家):三亚风情 文档编号:3428778 上传时间:2022-08-30 格式:PPT 页数:98 大小:2.93MB
下载 相关 举报
应用程序开发课件.ppt_第1页
第1页 / 共98页
应用程序开发课件.ppt_第2页
第2页 / 共98页
应用程序开发课件.ppt_第3页
第3页 / 共98页
应用程序开发课件.ppt_第4页
第4页 / 共98页
应用程序开发课件.ppt_第5页
第5页 / 共98页
点击查看更多>>
资源描述

1、 第第11章章 应用程序开发应用程序开发本章主要内容a)串口应用程序的编写方法。b)TCP/IP协议以及Socket的编写方法。c)基于uClinux音频接口的应用程序的编写 方法。d)键盘和LCD的应用程序的编写方法。e)汉字音乐点播程序的编写实例。第十一章 目录q1.串口应用程序 l 串口主要函数介绍l 串口举例 q2.网络应用l TCP/IP网络应用l Web服务器应用q3 音频设备应用l 常用音频文件格式l 播放WAV文件举例q4 键盘及LCD显示应用l LCD介绍l 键盘实现q5 汉字音乐点播应用第十一章 目录q1.串口应用程序 l 串口主要函数介绍l 串口举例 q2.网络应用l T

2、CP/IP网络应用l Web服务器应用q3 音频设备应用l 常用音频文件格式l 播放WAV文件举例q4 键盘及LCD显示应用l LCD介绍l 键盘实现p3 音频设备应用 本章从一个针对运行在本章从一个针对运行在S3C44B0X上的上的uClinux操作系统进行应用程序的开发入手,操作系统进行应用程序的开发入手,给出给出Windows操作系统平台上使用操作系统平台上使用Hitool for uClinux等工具开发的多种应用程序。等工具开发的多种应用程序。本章主要介绍了:本章主要介绍了:a)串口应用程序的编写方法。b)TCP/IP协议以及Socket的编写方法。c)基于uClinux音频接口的应

3、用程序的编写 方法。d)键盘和LCD的应用程序的编写方法。e)汉字音乐点播程序的编写实例。11.1 11.1 串口应用程序串口应用程序nS3C44B0X提供提供2个个UART收发器,对它们可以操作在中断方式或收发器,对它们可以操作在中断方式或DMA方式。它们内置波特率发生器,波特率发生器的时钟源为方式。它们内置波特率发生器,波特率发生器的时钟源为S3C44B0X的系统使用,所以最高速率可达的系统使用,所以最高速率可达115.2K bps。二个串口有。二个串口有单独的波特率发生器,接收、发送和控制单元,支持红外方式的传送单独的波特率发生器,接收、发送和控制单元,支持红外方式的传送和接收。和接收。

4、n同时,在同时,在S3C44B0X串口的接收器和发送器中都有串口的接收器和发送器中都有16字节的字节的FIFO,FIFO可以有效的降低接收器和发送器对可以有效的降低接收器和发送器对CPU的中断频率,提高发送的中断频率,提高发送和接收的效率。和接收的效率。n串口设备的可配置参数包括波特率,起始位数量,数据位数量,停止串口设备的可配置参数包括波特率,起始位数量,数据位数量,停止位数量和流量控制协议。位数量和流量控制协议。n在在Linux操作系统中,设备驱动是以主设备号为主,每个设备都有唯操作系统中,设备驱动是以主设备号为主,每个设备都有唯一的主设备号和从设备号。一的主设备号和从设备号。11.1.1

5、 11.1.1 串行口主要函数介绍串行口主要函数介绍 1.1.打开串口打开串口 在在Linux 下串口文件是位于下串口文件是位于/dev 下,串口下,串口0为为/dev/ttyS0,串口,串口1为为/dev/ttyS1,O_RDWR是以读写方式打开串口,是以读写方式打开串口,O_NOCTTY表示该程表示该程序不会成为控制终端,避免了当在键盘输入类似序不会成为控制终端,避免了当在键盘输入类似ctrl+c的命令后,终的命令后,终止程序的运行。止程序的运行。打开串口是通过使用标准的文件打开函数操作:打开串口是通过使用标准的文件打开函数操作:int fd;fd=open(/dev/ttyS0,O_RD

6、WR);if(-1=fd)perror(提示错误!提示错误!);11.1.1 11.1.1 串行口主要函数介绍串行口主要函数介绍2.2.设置串口设置串口最基本的设置串口包括波特率设置,效验位和停止位设置。串口的最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置如下设置主要是设置如下struct termios 结构体的各成员值:结构体的各成员值:struct termios unsigned short c_iflag;/输入模式标志输入模式标志unsigned short c_oflag;/输出模式标志输出模式标志unsigned short c_cflag;/控制模式

7、标控制模式标志志unsigned short c_lflag;/local mode flags unsigned char c_line;/line disciplineunsigned char c_ccNCC;/control characters ;11.1.1 11.1.1 串行口主要函数介绍串行口主要函数介绍n通过对通过对c_cflag的赋值,设置波特率,字符大小,使能本地连接,使能的赋值,设置波特率,字符大小,使能本地连接,使能串行口驱动读取输入数据。串行口驱动读取输入数据。n通过设置通过设置c_iflag,控制端口对字符的输入处理过程,控制端口对字符的输入处理过程,IGNPAR

8、符号常符号常量表示忽略奇偶性错误的字节,不对输入数据进行任何校验,量表示忽略奇偶性错误的字节,不对输入数据进行任何校验,ICRNL 将回车符映射为换行符。将回车符映射为换行符。这里就只考虑常见的一些设置:这里就只考虑常见的一些设置:(1)波特率设置:波特率设置:下面是修改下面是修改波特率波特率的代码:的代码:struct termios Opt;tcgetattr(fd,&Opt);cfsetispeed(&Opt,B19200);/设置为设置为19200Bpscfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);11.1.1 11.1.1 串行

9、口主要函数介绍串行口主要函数介绍(2)校验位和停止位的设置:校验位和停止位的设置:无效验无效验8 位位Option.c_cflag&=PARENB;Option.c_cflag&=CSTOPB;Option.c_cflag&=CSIZE;Option.c_cflag|=CS8;偶效验偶效验(Even)7 位位Option.c_cflag&=PARENB;Option.c_cflag|=PARODD;Option.c_cflag&=CSTOPB;Option.c_cflag&=CSIZE;Option.c_cflag|=CS7;奇效验奇效验(Odd)7 位位Option.c_cflag|=PAR

10、ENB;Option.c_cflag&=PARODD;Option.c_cflag&=CSTOPB;Option.c_cflag&=CSIZE;Option.c_cflag|=CS7;Space 效验效验7 位位Option.c_cflag&=PARENB;Option.c_cflag&=CSTOPB;Option.c_cflag&=&CSIZE;Option.c_cflag|=CS8;11.1.1 11.1.1 串行口主要函数介绍串行口主要函数介绍 设置停止位设置停止位1 位:位:options.c_cflag&=CSTOPB;2 位:位:options.c_cflag|=CSTOPB;需要

11、需要注意注意的是:的是:如果不是开发终端之类的,只是串口传输数据,而不需要串口来如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式处理,那么使用原始模式(Raw Mode)(Raw Mode)方式来通讯方式来通讯。设置方式如下:设置方式如下:options.c_lflag&=(ICANON|ECHO|ECHOE|ISIG);/Inputoptions.c_oflag&=OPOST;/Output3.3.读写串口读写串口设置好串口之后,读写串口就很容易,把串口当作文件读写就可以了。设置好串口之后,读写串口就很容易,把串口当作文件读写就可以了。(1)发送数据发送数据ch

12、ar buffer1024;int Length1024;11.1.1 11.1.1 串行口主要函数介绍串行口主要函数介绍 int nByte;nByte=write(fd,buffer,Length)(2)读取串口数据读取串口数据 使用文件操作使用文件操作read 函数读取,如果设置为原始模式函数读取,如果设置为原始模式(Raw Mode)传输传输数据,那么数据,那么read函数返回的字符数是实际串口收到的字符数。可以使函数返回的字符数是实际串口收到的字符数。可以使用操作文件的函数来实现异步读取,如用操作文件的函数来实现异步读取,如fcntl,或者,或者select等来操作。等来操作。cha

13、r buff1024;int Len1024;int readByte=read(fd,buff,Len);4.4.关闭串口关闭串口关闭串口就是关闭文件。关闭串口就是关闭文件。close(fd);11.1.2 11.1.2 串口举例串口举例 假设接收程序假设接收程序readtest.c运行在装有标准运行在装有标准Linux的的PC机上,发送程机上,发送程序序writetest.c运行在目标板运行在目标板S3C44B0X上,两台设备的串口通过交叉线上,两台设备的串口通过交叉线连接在一起。连接在一起。接收程序接收程序readtest.c的源码如下:的源码如下:#include#include#in

14、clude#include#include#include#include#include#include#include int spfd;int main()char fname16,hd16,*rbuf;int retv,i,ncount=0;struct termios oldtio;int realdata=0;spfd=open(/dev/ttyS1,O_RDWR|O_NOCTTY);if(spfd0)return-1;tcgetattr(spfd,&oldtio);/保存串口的当前设置保存串口的当前设置 cfmakeraw(&oldtio);cfsetispeed(&oldtio

15、,B19200);cfsetospeed(&oldtio,B19200);tcsetattr(spfd,TCSANOW,&oldtio);/选择新设置,选择新设置,TCSANOW表示设表示设 置立即生效置立即生效 rbuf=hd;printf(ready for receiving data.n);retv=read(spfd,rbuf,1);if(retv=-1)perror(read);reture-1;while(*rbuf!=0)ncount+=1;rbuf+;retv=read(spfd,rbuf,1);printf(the number received is%dn,retv);i

16、f(retv=-1)perror(read);for(i=0;incount;i+)realdata+=(hd i-48)*pow(10,ncount-i-1);printf(complete receiving the data%dn,realdata);close(spfd);return 0;11.1.2 11.1.2 串口举例串口举例发送程序发送程序writetest.c的源码如下:的源码如下:#include#include#include#include#include#include#include#include int spfd;int main(int argc,char*

17、argv)char fname16,*sbuf;int sfd,retv,i;struct termios oldtio;spfd=open(/dev/ttyS0,O_RDWR|O_NOCTTY);perror(open/dev/ttyS0);if(spfd0)return-1;printf(ready for sending data.n);tcgetattr(spfd,&oldtio);cfmakeraw(&oldtio);cfsetispeed(&oldtio,B19200);cfsetospeed(&oldtio,B19200);tcsetattr(spfd,TCSANOW,&oldt

18、io);fname0=1;fname1=2;fname2=3;fname3=0;sbuf=(char*)malloc(4);strncpy(sbuf,fname,4);retv=write(spfd,sbuf,4);if(retv=-1)perror(write);printf(the number of char sent is%dn,retv);close(spfd);return 0;11.1.2 11.1.2 串口举例串口举例 本例程实现:本例程实现:在发送端发送数字在发送端发送数字123123,在接收端接收,在接收端接收并显示接收到的数据。并显示接收到的数据。这里请同学们这里请同学们

19、注意注意的是:的是:发送方按字符发送数据,接收方将接收的字发送方按字符发送数据,接收方将接收的字符相应的符相应的asciiascii值与字符值与字符0 0所对应的所对应的asciiascii值相减,值相减,最终得到实际的十进制数值。最终得到实际的十进制数值。11.2 网络应用11.2.1 TCP/IP网络应用 以太网技术作为当前局域网的主流技术,可以提供从以太网技术作为当前局域网的主流技术,可以提供从10Mbit/s,100Mbit/s到到1000Mbit/s的物理带宽,以及比较好的抗干扰性、比较大的物理带宽,以及比较好的抗干扰性、比较大的网络半径和比较低系统维护费用;同时在不同速率以太网之间

20、保持的网络半径和比较低系统维护费用;同时在不同速率以太网之间保持比较好的前向兼容性,所以在系统升级时很方便。比较好的前向兼容性,所以在系统升级时很方便。图11-1 以太网电路结构图11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用1.1.网络基础网络基础(1)TCP/IP协议分层模型协议分层模型 在实际操作中接触到的通常只是网络系统的最高层在实际操作中接触到的通常只是网络系统的最高层应用层的用户界面。应用层的用户界面。实际上要进行网际的数据传送,需要经过如下的步骤:实际上要进行网际的数据传送,需要经过如下的步骤:需要发送的数据如需要发送的数据如E-mail、web页等,通过用

21、户界面由应用程序传送到应页等,通过用户界面由应用程序传送到应用程序的数据发送缓冲区,并设置好与下一层连接的参数等待发送。用程序的数据发送缓冲区,并设置好与下一层连接的参数等待发送。数据做好传输前的准备工作,进入传输层。传输层主要负责为两台主机上数据做好传输前的准备工作,进入传输层。传输层主要负责为两台主机上的应用程序提供端口到端口的通信。的应用程序提供端口到端口的通信。然后进入网络层的范畴。这里主要处理数据分组在网络中的活动,例如分然后进入网络层的范畴。这里主要处理数据分组在网络中的活动,例如分组的选路。组的选路。当然最终数据还是要靠物理层的电磁波或光导纤维来传输。当然最终数据还是要靠物理层的

22、电磁波或光导纤维来传输。在接收的一方是相反的过程,数据从最底层一直到应用层还原为在接收的一方是相反的过程,数据从最底层一直到应用层还原为 用户可以识别的信息,这一切都是由上面的协议来规范的。用户可以识别的信息,这一切都是由上面的协议来规范的。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用(2)数据的封装与分用数据的封装与分用 数据的封装数据的封装用户数据从应用层逐级传送到链路层,每经过一层都要被该层的协议用户数据从应用层逐级传送到链路层,每经过一层都要被该层的协议进行一定的封装、标识和改造,就是给这个数据增加一些头部信息进行一定的封装、标识和改造,就是给这个数据增加一些头

23、部信息(或尾部信息或尾部信息)。数据封装过程数据封装过程如图如图11-3所示。所示。图 11-3 数据的封装过程11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 数据的分用数据的分用(解包解包)在接收端接收这些数据的时候,经过拆分的数据要重新组合,并且去在接收端接收这些数据的时候,经过拆分的数据要重新组合,并且去掉各层加上的头部信息,把数据还原。掉各层加上的头部信息,把数据还原。(3)客户客户服务器模型服务器模型 目前大多数网络应用程序在编写时都采用客户目前大多数网络应用程序在编写时都采用客户服务器模型,假服务器模型,假设设端是客户,另一端是服务器,让服务器提供给客户一定的

24、服务内端是客户,另一端是服务器,让服务器提供给客户一定的服务内容。容。并发型交互并发型交互在并发型交互模式下,程度的主要运作步骤如下:在并发型交互模式下,程度的主要运作步骤如下:等待一个客户请求的到来;等待一个客户请求的到来;生成一个新的进程或者任务来处理这个客户请求,同时这里还可生成一个新的进程或者任务来处理这个客户请求,同时这里还可以以 接收其他客户的请求。处理结束后,终止这个进程。接收其他客户的请求。处理结束后,终止这个进程。反馈客户端;反馈客户端;等待新的客户请求的到来并进行下一次服务,如此循环运作。等待新的客户请求的到来并进行下一次服务,如此循环运作。11.2.1 TCP/IP11.

25、2.1 TCP/IP网络应用网络应用 重复型交互重复型交互 重复型交互摸式下,程序的的主要运作步骤如下:重复型交互摸式下,程序的的主要运作步骤如下:等待一个客户请求的到来;等待一个客户请求的到来;处理客户的请求,对客户进行服务;处理客户的请求,对客户进行服务;给客户反馈信息,服务结束;给客户反馈信息,服务结束;等待下一个请求到来,如此循环。等待下一个请求到来,如此循环。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用2.2.TCP套接字套接字 Linux系统的套接字是一个通用的网络编程接口。系统的套接字是一个通用的网络编程接口。TCP协议就是通协议就是通过套接字来实现连接的

26、建立的,这里将就这个过程具体化并对其内过套接字来实现连接的建立的,这里将就这个过程具体化并对其内部的函数进行必要的说明。部的函数进行必要的说明。(1)套接字地址结构套接字地址结构 在头文件在头文件中定义了以下结构来保持套接字函数调中定义了以下结构来保持套接字函数调用参数的一致性。用参数的一致性。struct sockaddr unsigned short sa_family;/地址类型,格式为地址类型,格式为AF_xxxchar sa_data14;/14字节的协议地字节的协议地址址;11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 其中的其中的sa_family为套接字的

27、协议簇地址类型,为套接字的协议簇地址类型,TCP/IP的协议对的协议对于于IPv4地址类型为地址类型为AF_INET。sa_data中存储具体的协议地址,不同中存储具体的协议地址,不同的协议簇有不同的地址格式。但一般编程中并不直接针对此数据结构的协议簇有不同的地址格式。但一般编程中并不直接针对此数据结构操作,而是使用另一个与操作,而是使用另一个与sockaddr等价的数据结构等价的数据结构sockaddr_in(在在netinet/in.h中定义中定义):struct sockaddr_in unsigned short int sin_len;/*IPv4地址长度地址长度*/short in

28、t sin_family;/*地址类型地址类型*/unsigned short int sin_port;/*存储端口号存储端口号*/struct in_addr sin_addr;/*存储存储IP地址地址*/unsigned char sin_zero8;/*空字节空字节*/;11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 在编程中大多数是使用在编程中大多数是使用sockaddr_in这个结构来设置获取地址信息。这个结构来设置获取地址信息。sin_family指协议族,在指协议族,在TCP套接字编程中只能是套接字编程中只能是AF_INET;sin_port存储端口号存储

29、端口号(使用网络字节顺序使用网络字节顺序),数据类型是一个,数据类型是一个16位的无符号整数位的无符号整数类型;类型;sin_addr存储存储IP地址,地址,IP地址使用地址使用in_addr这个数据结构:这个数据结构:struct in_addr unsigned long s_addr;s_addr按照网络字节顺序存储按照网络字节顺序存储IP地址;地址;sin_zero是为了让是为了让sockaddr与与sockaddr_in两个数据结构保持大小相同而保留的空字节。两个数据结构保持大小相同而保留的空字节。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用设置地址信息实例设

30、置地址信息实例(IPv4)struct sockaddr_in mysock;/*设置设置sockaddr_in的结构体变量的结构体变量 mysock*/mysock.sin_family=AF_INET;/*TCP地址结构地址结构*/mysock.sin_port=htons(3490);/*short,NBO*/mysock.sin_addr.s_addr=inet_addr(“166.111.160.10”);/*设置地址为设置地址为166.111.160.10*/bzero(&(mysock.sin_zero),8);/*设置设置sin_zero为为8位保留字节位保留字节*/注意:注意

31、:如果如果mysock.sin_addr.s_addr=INADDR_ANY,则不指定则不指定IP地址地址(用于用于Server程序程序)。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用(2)TCP客户客户-服务器通信模型服务器通信模型TCP客户客户-服务器通信过程服务器通信过程如图如图11-4所示。所示。图 11-4 TCP客户-服务器通信过程11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用(3)socket主要函数主要函数 强制类型转换函数的调用强制类型转换函数的调用:将指向于特定协议的套接口地址结构的指针类型将指向于特定协议的套接口地址结构的指针

32、类型-指向通用套接指向通用套接口地址结构的指针。口地址结构的指针。int connect(int,struct sockaddr*,socklen_t)struct sockaddr-in servaddr;connect(sockfd,(sturct sockaddr*)&servaddr,sizeof(servaddr);11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 主机字节序和网络字节序的转换函数:主机字节序和网络字节序的转换函数:#include unit16_t htons(uint16_t host16bitvalue);unit32_t htons(uin

33、t32_t host32bitvalue);unit16_t ntohs(uint16_t net16bitvalue);unit32_t ntohs(uint32_t net32bitvalue);h:host n:network s:short(16 bits)l:long(32 bits)11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 int socket(int domain,int type,int protocol)domain:说明我们网络程序所在的主机采用的通讯协族说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和和AF_INET等等)。type:

34、我们网络程序所采用的通讯协议我们网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等等)SOCK_STREAM表明我们用表明我们用的是的是TCP协议,这样会提供按顺序的,可靠,双向,面向连接的比特协议,这样会提供按顺序的,可靠,双向,面向连接的比特流。流。SOCK_DGRAM 表明我们用的是表明我们用的是UDP协议,这样只会提供定长协议,这样只会提供定长的,不可靠,无连接的通信。的,不可靠,无连接的通信。protocol:由于我们指定了由于我们指定了type,所以这个地方我们一般只要用所以这个地方我们一般只要用0来代替来代替就可以了。就可以了。socket为网络通讯做基本的

35、准备。成功时返回文件描述符,失败时返为网络通讯做基本的准备。成功时返回文件描述符,失败时返回回-1,看,看errno可知道出错的详细情况。可知道出错的详细情况。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 int bind(int sockfd,struct sockaddr*my_addr,int addrlen)sockfd:是由是由socket调用返回的文件描述符。调用返回的文件描述符。addrlen:是是sockaddr结构的长度。结构的长度。my_addr:是一个指向是一个指向sockaddr的指针。的指针。int listen(int sockfd,int

36、backlog)sockfd:是是bind后的文件描述符。后的文件描述符。backlog:设置请求排队的最大长度。当有多个客户端程序和服务端相设置请求排队的最大长度。当有多个客户端程序和服务端相连时连时,使用这个表示可以介入的排队长度。使用这个表示可以介入的排队长度。listen函数将函数将bind的文件描的文件描述符变为监听套接字,返回的情况和述符变为监听套接字,返回的情况和bind一样。一样。int accept(int sockfd,struct sockaddr*addr,int*addrlen)sockfd:是是listen后的文件描述符。后的文件描述符。addr,addrlen是用

37、来给客户端的程序填写的是用来给客户端的程序填写的,服务器端只要传递指针服务器端只要传递指针就可以了。就可以了。bind,listen和和accept是服务器端用的函数,是服务器端用的函数,accept调用时调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接。服务器端的程序会一直阻塞到有一个客户程序发出了连接。accept成功时返回最后的服务器端的文件描述符成功时返回最后的服务器端的文件描述符,这个时候服务器端可这个时候服务器端可以向该描述符写信息了,失败时返回以向该描述符写信息了,失败时返回-1。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 int connec

38、t(int sockfd,struct sockaddr*serv_addr,int addrlen)sockfd是是socket返回的文件描述符。返回的文件描述符。serv_addr:储存了服务器端的连接信息,其中储存了服务器端的连接信息,其中sin_add是服务端的地是服务端的地址。址。addrlen:serv_addr的长度的长度。connect函数是客户端用来同服务端连接的。成功时返回函数是客户端用来同服务端连接的。成功时返回0,sockfd是是同服务端通讯的文件描述符,失败时返回同服务端通讯的文件描述符,失败时返回-1。ssize_t write(int fd,const void*

39、buf,size_t nbytes)write函数将函数将buf中的中的nbytes字节内容写入文件描述符字节内容写入文件描述符fd。成功时返回成功时返回写的字节数,写的字节数,失败时返回失败时返回-1。并设置。并设置errno变量,在网络程序中,当变量,在网络程序中,当我们向套接字文件描述符写时有两种可能。我们向套接字文件描述符写时有两种可能。write的返回值大于的返回值大于0,表示写了部分或者是全部的数据。表示写了部分或者是全部的数据。返回的值小于返回的值小于0,此时出现了错误此时出现了错误.我们要根据错误类型来处理。我们要根据错误类型来处理。11.2.1 TCP/IP11.2.1 TC

40、P/IP网络应用网络应用 ssize_t read(int fd,void*buf,size_t nbyte)read函数是从函数是从fd中读取内容。当读成功时,中读取内容。当读成功时,read返回实际所读的字节返回实际所读的字节数,如果返回的值是数,如果返回的值是0 表示已经读到文件的结束了,小于表示已经读到文件的结束了,小于0表示出现了表示出现了错误。错误。recv和和send函数提供了和函数提供了和read和和write差不多的功能,不过提供了第四差不多的功能,不过提供了第四个参数来控制读写操作。个参数来控制读写操作。int recv(int sockfd,void*buf,int le

41、n,int flags)int send(int sockfd,void*buf,int len,int flags)前面的三个参数和前面的三个参数和read,write一样一样,第四个参数可以是第四个参数可以是0或者是以下的组或者是以下的组合合:MSG_DONTROUTE:不查找路由表不查找路由表 MSG_OOB:接受或者发送带外数据接受或者发送带外数据 MSG_PEEK:查看数据查看数据,并不从系统缓冲区移走数据并不从系统缓冲区移走数据 MSG_WAITALL:等待所有数据等待所有数据11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用3.3.举例举例 我们将使用我们将使用

42、TCP协议提供的服务,组成一个简单的重复型的网络协议提供的服务,组成一个简单的重复型的网络时间服务器。在一台时间服务器。在一台EV44B0II系统中启动服务程序并指定服务端口。系统中启动服务程序并指定服务端口。在另外一台在另外一台EV44B0II系统中启动客户端程序并指定服务器系统中启动客户端程序并指定服务器IP地址和地址和服务端口。服务器将接收该服务,并返回服务器本地的系统时间。服务端口。服务器将接收该服务,并返回服务器本地的系统时间。本程序使用本程序使用TCP协议,可以工作在服务器或客户端状态。使用的默认协议,可以工作在服务器或客户端状态。使用的默认端口号为端口号为9988。程序流程图程序

43、流程图如图如图11-5所示所示:图11-5 流程图11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用附程序清单:附程序清单:/*TCP/IP nettime service*/#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include extern char*optarg;/*getopt*/#define COM_SERVER 1#

44、define COM_CLIENT2int ComStatus;#define PORT_NUMBER 0 x1000short ComPort;int main(int argc,char*argv)int fd_listen,fd_client,fd_service;char server_ip64;int port;struct sockaddr_in sn=AF_INET;int sa_len;char*buffer;int start,packet_len,c,counter;int debug;ComStatus=COM_SERVER;ComPort=PORT_NUMBER;whi

45、le(c=getopt(argc,argv,sc:o:)!=-1)switch(c)case c:/*get server ip address*/memcpy(server_ip,optarg,(strlen(optarg)+1);ComStatus=COM_CLIENT;break;case s:/*open debug flag*/ComStatus=COM_SERVER;break;case o:ComPort=atoi(optarg);break;default:/*print usage*/fprintf(stderr,Usage:%s -c|-s -p n,argv0);exit

46、(1);/*setup address and port*/sn.sin_port=_constant_htons(ComPort);sn.sin_addr.s_addr=0;if(argc 2)fprintf(stderr,n argv too less n);exit(1);/*alloc mem for data buffer*/packet_len=256;buffer=malloc(packet_len);if(buffer 0)fprintf(stderr,n malloc buffer error n);exit(1);if(ComStatus=COM_SERVER)/*serv

47、er process*/if(fd_listen=socket(AF_INET,SOCK_STREAM,0)0)fprintf(stderr,ncan not open server socket,exitn);exit(1);if(bind(fd_listen,(struct sockaddr*)&sn,sizeof(sn)0)fprintf(stderr,ncan not bin server,socket,exitn);close(fd_listen);exit(1);if(listen(fd_listen,1)0)fprintf(stderr,listen failed,exit);c

48、lose(fd_listen);exit(1);sa_len=sizeof(sn);printf(nget service request from%sn,inet_ntoa(sn.sin_addr);start=time(0);*(int*)buffer=start;while(1)/*loop service*/fd_service=accept(fd_listen,(struct sockaddr*)&sn,&sa_len);if(fd_service 0)perror(accept failed);exit(1);elseif(write(fd_service,buffer,packe

49、t_len)0)perror(server write);close(fd_listen);close(fd_service);exit(1);printf(ncurrent time%d sn,start);close(fd_service);close(fd_listen);else/*client process*/if(fd_client=socket(AF_INET,SOCK_STREAM,0)0)perror(client socket);exit(1);sn.sin_addr.s_addr=inet_addr(server_ip);sa_len=sizeof(sn);if(con

50、nect(fd_client,(struct sockaddr*)&sn,sa_len)0)perror(client connect);close(fd_client);exit(1);if(counter=read(fd_client,buffer,packet_len)boa c /tmp/&”命令。命令。11.2.2 web11.2.2 web服务器应用服务器应用3.3.程序说明程序说明程序说明如下程序说明如下:/*rc*/*本脚本将为本脚本将为boa建立运行的根目录,和其他运行环境建立运行的根目录,和其他运行环境*/hostname Samsung/bin/expand/etc/ra

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(应用程序开发课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|