嵌入式linux课程设计报告聊天程序设计_第1页
嵌入式linux课程设计报告聊天程序设计_第2页
嵌入式linux课程设计报告聊天程序设计_第3页
嵌入式linux课程设计报告聊天程序设计_第4页
嵌入式linux课程设计报告聊天程序设计_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、重庆科技学院课程设计成果 院(系):_电气与信息工程学院_ 班 级: 计科普0802 学生姓名: 学 号: 设计地点(单位)_ _i315 _ _设计题目:_ 聊天程序设计_ _ 完成日期: 2011 年 9 月 5 日 指导教师评语: _ 成绩(五级记分制):_ _ 教师签名:_摘要嵌入式linux在电子行业的应用很广泛,学习嵌入式linux显得非常重要。这次课程设计的主要目的是检验上学期学习linux后的效果。通过基础题的代码编写,熟悉linux c语言编程技巧。通过完成聊天程序的设计,熟悉linux底层编程。利用qt设计界面,缩短开发时间。关键字:嵌入式linux;基础题;聊天程序;qt

2、 目 录课程设计任务书- 4 -题目一 基础题- 6 -1 设计内容及要求- 6 -1.1 二小题- 6 -1.2三小题- 6 -1.3四小题- 7 -1.3五小题- 9 -1.4六小题- 11 -1.5七小题- 11 -1.6八小题- 13 -题目二 聊天程序设计- 15 -1设计内容及要求- 15 -1.1 聊天程序的基本要求- 15 -1.2 需实现的主要功能- 15 -2需求分析- 15 -2.1 qt设计- 15 -2.2服务器端和客户端的数据传输方式- 16 -2.3 服务器端功能设计- 16 -2.4客户端功能设计- 17 -3总体设计- 17 -3.1 总体功能- 17 -4.

3、 详细设计- 17 -4.1 功能分析和描述- 17 -4.2 客户端功能模块- 17 -4.3 服务器功能模块- 19 -5. 代码实现- 20 -5.1 客户端代码- 20 -5.2 服务器端代码- 22 -6功能实现- 23 -7总结- 23 -8致谢- 23 -9参考文献- 23 -课程设计任务书设计题目:基础题目学生姓名庄桐泉课程名称嵌入式linux课程设计专业班级计科普2008地 点i315起止时间2011-8-29至2011-9-9设计内容及要求 gcc编译器的使用,linux系统c程序设计编译、调试方法1、 编写程序将数组内容倒置a=”123456789”。2、 利用指针将数据

4、a的内容复制到数据b。3、 创建两线程,通过打印输出各自线程号和打印次序,要求从打印结果看出两个线程是并发执行的。4、 创建两线程,a线程通过消息队列发消息,b线程收到后在屏幕打印输出,要求两线程个打印出线程号和消息内容。5、 创建两线程,a线程循环打印数组a100,b线程循环将数组成员+1,要求利用互斥锁,使每次输出a0=a99.6、 创建两线程,a线程每2秒打印一次字母a,b线程每秒打印一次字母b,要求利用同步信号量,使输出字母b总是在a之后。8、通过makefile,将project中的一个.c编译成.a,另一个.c调用.a的函数,要求实现静态库的生成和调用,运行结果正确。设计参数进度要

5、求第一周之内完成参考资料1、嵌入式linux应用程序开发标准教程.人民邮电出版社。华清远见嵌入式培训中心。2010.72、zlg armmagic2410实验指导、资料。其它设计题目:聊天程序设计学生姓名庄桐泉课程名称嵌入式linux课程设计专业班级计科普2008地 点i315起止时间2011-8-29至2011-9-9设计内容及要求 1、在qt(或minigui)编写聊天程序,交叉编译后下载到目标机,可实现两台目标机可发送文本聊天2、qt(或minigui)界面设计至少包括“发送”,“重置”两个按钮,要求必须把目标机的硬件键盘映射到qt设计的软件界面中,实现软件按钮的功能。选作:发送文件。设

6、计参数进度要求做完基础题目之后开始做本题目。参考资料1、嵌入式linux应用程序开发标准教程.人民邮电出版社。华清远见嵌入式培训中心。2010.72、zlg armmagic2410实验指导、资料。其它说明.本表应在每次实施前一周由负责教师填写二份,学院审批后交学院教务办备案,一份由负责教师留用。.若填写内容较多可另纸附后。3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。系主任: 指导教师: 2011年 9 月 5 日题目一 基础题1 设计内容及要求1.1 二小题(1) 编写程序将数组内容倒置a=”123456789”。(2) 程序代码实现如下:char a=012345678

7、9; char tmp;int i = 0,j = 0;for(i = 0,j = strlen(a)-1;i=strlen(a)/2-1;i+,j-) tmp = ai; ai = aj; aj = tmp;for(i = 0;istrlen(a);i+) printf(%c,ai);printf(n);(3)程序分析:定义数组数组内容倒置输出倒置后数组内容(4)程序执行效果如下:1.2三小题(1)利用指针将数据a的内容复制到数据b。(2)程序代码实现如下:char a = abcd;char b =1234; int i = 0;char *tmp; tmp = a; for(i = 0;

8、istrlen(a);i+) bi = *tmp+;for(i = 0;istrlen(a);i+) printf(%c,bi);printf(n);(3)程序分析:定义数组定义指针指针指向数组a移动指针拷贝数字到b中显示拷贝后的数组(4)程序执行效果如下: 1.3四小题(1)创建两线程,通过打印输出各自线程号和打印次序,要求从打印结果看出两个线程是并发执行的。(2)程序代码如下:#define thread_number2#define repeat_number5#define delay_time_levels10.0void * thrd_func(void *arg) int thr

9、d_num = (int)arg;int delay_time = 0;int count = 0;printf(thread %d is startingn, thrd_num);for (count = 0; count repeat_number; count+)delay_time = (int)(rand() * delay_time_levels/(rand_max) + 1;sleep(delay_time); printf(tthread %d: job %d delay = %dn, thrd_num, count, delay_time);printf(thread %d

10、finishedn, thrd_num);pthread_exit(null); int main(void)pthread_t threadthread_number;int no = 0, res;void * thrd_ret;for (no = 0; no thread_number; no+) res = pthread_create(&threadno, null, thrd_func, (void*)no);for (no = 0; no msg_text); pthread_exit(null); void * thrd_func1(void *arg) int thrd_nu

11、m = (int)arg;printf(thread %d is startingn, thrd_num);/*读取消息队列*/msgrcv(qid, &msg, bufsz, getpid(), 0); printf(recv the message is:%sn,(&msg)-msg_text);pthread_exit(null);void *(*const functhread_number)(void *)=thrd_func0,thrd_func1;int main(void)pthread_t threadthread_number;int no = 0, res;void *

12、thrd_ret;key_t key;int len; key = ftok(., a); qid = msgget(key,ipc_creat|0666); for (no = 0; no thread_number; no+)res = pthread_create(&threadno, null, funcno, (void*)no);for (no = 0; no thread_number; no+) res = pthread_join(threadno, &thrd_ret); (msgctl(qid, ipc_rmid, null); return 0; (3) 代码分析如下:

13、该程序实现了使用消息队列进行线程之间的通信,包括消息队列的创建、消息发送和读取、消息队列的撤销和删除等操作。 定义消息队列消息结构体 创建线程0,用于消息队列发送消息 添加消息到消息队列 退出线程 创建线程1,用于消息队列读取消息 读取消息队列 根据不同的路径和关键表示产生标准的key 创建消息队列 等待线程 从系统内核中移走消息队列 (4)程序执行效果如下: 1.4六小题(1)创建两线程,a线程循环打印数组a100,b线程循环将数组成员+1,要求利用互斥锁,使每次输出a0=a99.(2)程序源代码如下:(3)程序分析如下:1.5七小题(1)创建两线程,a线程每2秒打印一次字母a,b线程每秒打

14、印一次字母b,要求利用同步信号量,使输出字母b总是在a之后。 (2)程序代码如下:#define thread_number 2sem_t semthread_number;void * thrd_func0(void *arg) /a arg = arg;while(1) printf(an); sem_post(&sem1); sleep(2); pthread_exit(null); void * thrd_func1(void *arg) /b arg = arg;while(1) sem_wait(&sem1); printf(bn); sleep(1); pthread_exit(

15、null);void *(*const functhread_number)(void *)=thrd_func0,thrd_func1;int main(void)pthread_t threadthread_number;int no = 0, res;void * thrd_ret;for (no = 0; no thread_number; no+) res = pthread_create(&threadno, null, funcno, (void*)no);printf(create thread successn waiting for threads to finish.n)

16、;for (no = 0; no thread_number; no+) sem_destroy(&semno);return 0; (3)程序分析如下: 程序创建两线程,实现a线程每2秒打印一次字母a,b线程每秒打印一次字母b,利用同步信号量,使输出字母b总是在a之后。 创建线程0执行函数,用于打印字符a 打印字符a 对信号量1进行v操作 延时2s 退出线程 创建线程1执行函数,用于打印字符b 对信号量1进行p操作 打印字符b 延时1s 创建线程(4)程序执行效果如下:1.6八小题 (1)通过makefile将project中的一个.c编译成.a,另一个.c调用.a的函数,要求实现静态库的生

17、成和调用,运行结果正确。 (2)编写静态库程序thread.c如下:#include void pf1(void) printf(*n); return;void pf2(void) printf(#n); return;该程序定义两个函数,分别打印不同的内容,该程序将被编译成.a静态库编写调用程序call.c如下:extern void pf1(void);extern void pf2(void);int main(void) pf1(); pf2(); return 0;该程序对静态库进行调用,调用静态库中的两个函数pf1和pf2。编写makefile如下:cc=gcccppflags=

18、-cobjs = thread.osource = thread.ccall_source=call.clib = libthread.aexec=callar=arthread: $objs$cc -c $source -o $objs $ar rcsv $(lib) thread.o$cc -o $exec $call_source -l. -lthread.phony : cleanclean :-rm -f $objs $exec $libmakefile文件实现对静态库程序编译成.a静态库,并且编译调用静态库的程序call.c为可执行文件call(4)程序执行效果如下: 题目二 聊天

19、程序设计1设计内容及要求1.1 聊天程序的基本要求1、在qt(或minigui)编写聊天程序,交叉编译后下载到目标机,可实现两台目标机可发送文本聊天。2、qt(或minigui)界面设计至少包括“发送”,“重置”两个按钮,要求必须把目标机的硬件键盘映射到qt设计的软件界面中,实现软件按钮的功能。1.2 需实现的主要功能(1) 客户端输入服务器ip和端口号。(2) 服务器必须成功启动。(3) 每一个客户端可以寻找服务器,并且与服务器建立连接。(4) 客户端和服务器可以实现通信。(5) 通信的内容可以显示在面板上。(6) 利用qt设计界面,并下载到magicarm2410上面。2需求分析2.1 q

20、t设计qt设计编写和调试阶段使用周立功magicarm2410箱子提供的qt for pc编译器,运行测试阶段使用qt for arm编译器。使用qt for pc阶段编译程序的步骤如下(以编译hello.cpp程序为例):(1)进入/x86-qtopia目录,运行set-env脚本,设置环境变量。$ . set-env(2)进入hello目录,然后用progen工具生成工程文件。$ cd hello$ vi hello.cpp$ progen t app.t o (3)使用tmake工具,生成hello工程的makefile文件。$ tmake -o ma

21、kefile (4)修改makefile文件,在libs变量中增加需要用到的库,然后输入make命令编译。libs = $(sublibs) -l$(qtdir)/lib -lqte -lm -lstdc+$ make(5)启动虚拟控制台,运行hello程序(主机须启动帧缓冲,必须能够访问/dev/fb0)。$ cd /zylinux/x86-qtopia$ . set-env$ cd hello$ ./hello qws如果要将hello程序发布到magicarm2410上运行,还需进行以下工作:(6)进入/zylinux/arm-qtopia目录,并将hello工程复制到

22、当前目录下。$ cd /zylinux/arm-qtopia$ cp av /zylinux/x86-qtopia/hello (7)运行当前目录下的set-env文件,重新设置环境变量,进入hello目录,使用tmake工具,重新生成makefile文件。$ . set-env$ cd hello$ tmake -o makefile (8)按照步骤(4)的方法修改包含库,编译,得到可执行文件hello,将hello文件添加到文件系统中,更新文件系统。(9)插入usb鼠标和usb键盘,启动magicarm2410。启动qtopia的终端,运行hello程序。利用同样的编译方

23、法,客户端qt程序进行编译和调试。2.1.1 客户端qt界面设计客户端qt需要以下基本组件:(1)两个qeditline,一个用于输入服务器ip地址(可读可写),另一个用于输入服务器端口号(可读可写)。(2)三个按钮,一个用于连接服务器,另一个用于发送消息,最后一个用于清空发送区域数据。(3)四个标签,用于显示不用组件的内容。(4)两个multilineedit,一个用于显示通信内容(只读),一个作为发送区域(可读可写)。2.2服务器端和客户端的数据传输方式 服务器端和客户端的数据是用tcp套接字来传输的。ip地址表示internet上的计算机,端口号标识正在计算机运行的进程。端口号与ip地址

24、的组合得出一个网络套接字。客户端使用linux c 函数socket建立到服务器的套接字连接。 当套接字连接socket建立后,可以利用linux c语言中的send函数和recv函数来实现简单的发送和接收消息。2.3 服务器端功能设计由于时间有限,服务器并没有用qt来编写界面,只是实现一个简单的控制程序。服务器主要实现有:(1)创建套接字(2)对套接字、ip地址和端口号进行绑定(3)进行监听(4)等待客户端的连接(5)对客户端接收和发送数据2.4客户端功能设计客户端使用qt设计界面,客户端实现的功能如下: (1)创建套接字 (2)连接服务器 (3)与服务器通信3总体设计3.1 总体功能根据对

25、需求所做的分析,聊天程序需要实现的基本功能应包括以下几个方面:(1) 客户端输入服务器ip和端口号。(2) 服务器必须成功启动。(3) 每一个客户端可以寻找服务器,并且与服务器建立连接。(4) 客户端和服务器可以实现通信。(5) 通信的内容可以方便查看。 使用qt设计的界面简洁,大方,操作简单,方便,容易上手,用户可以快速掌握操作流程。4. 详细设计4.1 功能分析和描述 聊天工具包括两大功能模块:客户端和服务器端。具体实现的功能创建套接字、连接通信、接收数据显示和发送数据。4.2 客户端功能模块 4.2.1 连接服务器连接服务器之前需要解析服务器地址、创建套接字、设置sockaddr_in

26、结构体中相关参数。4.2.2发送消息功能连接功能是开始聊天前必须进行的步骤,连接成功之后,就可以进行发送消息了。发送消息功能流程图如图2-5所示: 图2-5 发送消息功能流程图4.2.3接收消息模块连接成功后,就可以接收服务器发送过来的数据。4.3 服务器功能模块 服务器的设计并没有使用qt编写界面,服务器端实现的功能有: 图2-8 服务器模块流程图5. 代码实现5.1 客户端代码5.1.1 qt构造和析构函数editdemo:editdemo( qwidget *parent, const char *name):qwidget(parent, name)qgridlayout *grid

27、= new qgridlayout(this, 6, 3, 0, 0);/ip addrqlabel *label1 = new qlabel( ip addr:, this);grid-addwidget( label1, 0, 0 );edit_ip = new qlineedit(this); edit_ip-settext();grid-addwidget( edit_ip, 0, 1 );/server portqlabel *label2 = new qlabel( server port:, this);grid-addwidget( label2, 1, 0)

28、;edit_port = new qlineedit(this); edit_port-settext(4321);grid-addwidget( edit_port, 1, 1);qpushbutton *btn = new qpushbutton(connect, this); /*add the connect button*/ grid-addwidget( btn, 2, 1); /*add the button*/connect(btn, signal(clicked(), this, slot(buttonconnect(); /multiline input modeqlabe

29、l *label3 = new qlabel( contract area:, this);grid-addwidget(label3, 3, 0);multiedit_contract = new qmultilineedit(this); multiedit_contract-setreadonly(1);/set read only grid-addwidget(multiedit_contract,3,1); qlabel *label4 = new qlabel( send area:, this);grid-addwidget(label4, 4, 0);multiedit_sen

30、d = new qmultilineedit(this); grid-addwidget(multiedit_send,4,1);qpushbutton *button_send = new qpushbutton(send, this); /*add the send button*/ grid-addwidget( button_send, 5, 0); connect(button_send, signal(clicked(), this, slot(buttonsend(); qpushbutton *button_clear = new qpushbutton(clear, this

31、); /*add the clear button*/ grid-addwidget( button_clear, 5, 1); connect(button_clear, signal(clicked(), this, slot(buttonclear(); editdemo:editdemo()if(socket_flag = 1)/*if create socket success*/ close(sockfd); /*close the socket*/ printf(close the socketn);5.1.2 创建套接字void editdemo:createsocket(vo

32、id)/*地址解析函数*/host = gethostbyname(edit_ip-text();/*创建socket*/sockfd = socket(af_inet,sock_stream,0);/*设置sockaddr_in 结构体中相关参数*/serv_addr.sin_family = af_inet;serv_addr.sin_port = htons(atoi(edit_port-text();serv_addr.sin_addr = *(struct in_addr *)host-h_addr);bzero(&(serv_addr.sin_zero), 8); 5.1.3 创建

33、线程void *task(void *arg) int recvbytes = 0; char bufbuffer_size= 0; arg = arg; while(1) if(recvbytes = recv(sockfd, buf, buffer_size, 0) 0) multiedit_contract-append(server said: +(qstring)buf); void createthread(void)int result = 0;result = pthread_create(&thread1, null, task, (void *)0); /*create thread*/5.2 服务器端代码#define port 4321#define buffer_size 1024#define max_que_conn_nm 5int main()struct sockaddr_in server_sockaddr, client_sockaddr;int sin_size, recvbytes;unsigned int sendbytes = 0;int sockfd, client_f

温馨提示

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

评论

0/150

提交评论