课程设计成果
院(系)_电气信息工程学院_ 班 级 计科普
学生姓名 学 号
设计点(单位)___ _________ _______
设计题目_____ 聊天程序设计_________________________ _
完成日期: 2011 年 9 月 X 日
指导教师评语 _______________________________________
_________________________________________________________________________________________________________________________________________________________________________________________________________
成绩(五级记分制)______ __________
教师签名_________________________
摘
嵌入式linux电子行业应广泛学嵌入式linux显非常重次课程设计目检验学期学linux效果通基础题代码编写熟悉linux C语言编程技巧通完成聊天程序设计熟悉linux底层编程利QT设计界面缩短开发时间
关键字:嵌入式linux基础题聊天程序QT
目 录
课程设计务书 4
题目 基础题 6
1 设计容求 6
11 二题 6
12三题 6
13四题 7
13五题 9
14六题 11
15七题 11
16八题 13
题目二 聊天程序设计 15
1.设计容求 15
11 聊天程序基求 15
12 需实现功 15
2.需求分析 15
21 QT设计 15
22服务器端客户端数传输方式 16
23 服务器端功设计 16
24客户端功设计 17
3.总体设计 17
31 总体功 17
4 详细设计 17
41 功分析描述 17
42 客户端功模块 17
43 服务器功模块 19
5 代码实现 20
51 客户端代码 20
52 服务器端代码 22
6.功实现 23
7.总结 23
8.致谢 23
9.参考文献 23
课程设计务书
设计题目:基础题目
学生姓名
课程名称
嵌入式linux课程设计
专业班级
计科普
点
起止时间
2011829201199
设计容求
GCC编译器LINUX系统C程序设计编译调试方法
1 编写程序数组容倒置a[]123456789
2 利指针数A容复制数B
3 创建两线程通印输出线程号印次序求印结果出两线程发执行
4 创建两线程A线程通消息队列发消息B线程收屏幕印输出求两线程印出线程号消息容
5 创建两线程A线程循环印数组a[100]B线程循环数组成员+1求利互斥锁次输出a[0]a[99]
6 创建两线程A线程2秒印次字母AB线程秒印次字母B求利步信号量输出字母B总A
8通Makefileproject中c编译成ac调a函数求实现静态库生成调运行结果正确
设计
参数
进度
求
第周完成
参考资料
1嵌入式Linux应程序开发标准教程民邮电出版社华清远见嵌入式培训中心20107
2ZLG ARMMAGIC2410实验指导资料
设计题目:聊天程序设计
学生姓名
课程名称
嵌入式linux课程设计
专业班级
计科普
点
起止时间
2011829201199
设计容求
1QT(miniGUI)编写聊天程序交叉编译载目标机实现两台目标机发送文聊天
2QT(miniGUI)界面设计少包括发送重置两钮求必须目标机硬件键盘映射QT设计软件界面中实现软件钮功
选作:发送文件
设计
参数
进度
求
做完基础题目开始做题目
参考资料
1嵌入式Linux应程序开发标准教程民邮电出版社华清远见嵌入式培训中心20107
2ZLG ARMMAGIC2410实验指导资料
说明
1表应次实施前周负责教师填写二份学院审批交学院教务办备案份负责教师留2填写容较纸附3题名学生设计容参数求等方面应区
系: 指导教师: 2011年 9 月 5 日
题目 基础题
1 设计容求
11 二题
(1) 编写程序数组容倒置a[]123456789
(2) 程序代码实现:
char a[]0123456789 ①
char tmp
int i 0j 0
for(i 0j strlen(a)1i
tmp a[i]
a[i] a[j]
a[j] tmp
}
for(i 0i
printf(\n)
(3)程序分析:
①定义数组
②数组容倒置
③输出倒置数组容
(4)程序执行效果:
12三题
(1)利指针数A容复制数B
(2)程序代码实现:
char A[] abcd
char B[] 1234 ①
int i 0
char *tmp ②
tmp A ③
for(i 0i
for(i 0i
printf(\n)
(3)程序分析:
①定义数组
②定义指针
③指针指数组A
④移动指针拷贝数字B中
⑤显示拷贝数组
(4)程序执行效果:
13四题
(1)创建两线程通印输出线程号印次序求印结果出两线程发执行
(2)程序代码:
#define THREAD_NUMBER 2
#define REPEAT_NUMBER 5
#define DELAY_TIME_LEVELS 100
void * thrd_func(void *arg) ①
{
int thrd_num (int)arg
int delay_time 0
int count 0
printf(Thread d is starting\n 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 d\n thrd_num count delay_time)
}
printf(Thread d finished\n thrd_num)
pthread_exit(NULL) ③
}
int main(void)
{
pthread_t thread[THREAD_NUMBER]
int no 0 res
void * thrd_ret
for (no 0 no < THREAD_NUMBER no++) ④
{
res pthread_create(&thread[no] NULL thrd_func (void*)no)
}
for (no 0 no < THREAD_NUMBER no++)
{
res pthread_join(thread[no] &thrd_ret)
}
return 0
}
(3)程序分析:
程序中创建2线程更加方便描述线程间行执行2线程重执行函数线程5次循环次循环间会机等110s时间意义模拟务达时间机更加形象出线程间行执行
① 创建线程执行函数程序中2线程重执行函数
② 线程延时延时时间机产生
③ 线程退出
④ 创建2线程
(4)程序执行效果:
13五题
(1)创建两线程A线程通消息队列发消息B线程收屏幕印输出求两线程印出线程号消息容
(2)程序代码:
#define BUFSZ 512
#define THREAD_NUMBER 2
struct message ①
{
long msg_type
char msg_text[BUFSZ]
}
struct message msg
int qid *Create queue*
void * thrd_func0(void *arg) ②
{
int thrd_num (int)arg
int len 0
printf(Thread d is starting\n thrd_num)
sprintf(msgmsg_textssend the msg)
msgmsg_type getpid()
len strlen(msgmsg_text)
*添加消息消息队列*
msgsnd(qid &msg len 0) ③
printf(send the message iss\n(&msg)>msg_text)
pthread_exit(NULL) ④
}
void * thrd_func1(void *arg) ⑤
{
int thrd_num (int)arg
printf(Thread d is starting\n thrd_num)
*读取消息队列*
msgrcv(qid &msg BUFSZ getpid() 0) ⑥
printf(recv the message iss\n(&msg)>msg_text)
pthread_exit(NULL)
}
void *(*const func[THREAD_NUMBER])(void *){thrd_func0thrd_func1}
int main(void)
{
pthread_t thread[THREAD_NUMBER]
int no 0 res
void * thrd_ret
key_t key
int len
key ftok( 'a') ⑦
qid msgget(keyIPC_CREAT|0666) ⑧
for (no 0 no < THREAD_NUMBER no++)
{
res pthread_create(&thread[no] NULL func[no] (void*)no)
}
for (no 0 no < THREAD_NUMBER no++) ⑨
{
res pthread_join(thread[no] &thrd_ret)
}
(msgctl(qid IPC_RMID NULL) ⑩
return 0
}
(3) 代码分析:
该程序实现消息队列进行线程间通信包括消息队列创建消息发送读取消息队列撤销删等操作
① 定义消息队列消息结构体
② 创建线程0消息队列发送消息
③ 添加消息消息队列
④ 退出线程
⑤ 创建线程1消息队列读取消息
⑥ 读取消息队列
⑦ 根路径关键表示产生标准key
⑧ 创建消息队列
⑨ 等线程
⑩ 系统核中移走消息队列
(4)程序执行效果:
14六题
(1)创建两线程A线程循环印数组a[100]B线程循环数组成员+1求利互斥锁次输出a[0]a[99]
(2)程序源代码:
(3)程序分析:
15七题
(1)创建两线程A线程2秒印次字母AB线程秒印次字母B求利步信号量输出字母B总A
(2)程序代码:
#define THREAD_NUMBER 2
sem_t sem[THREAD_NUMBER]
void * thrd_func0(void *arg) A ①
{
arg arg
while(1)
{
printf(A\n) ②
sem_post(&sem[1]) ③
sleep(2) ④
}
pthread_exit(NULL) ⑤
}
void * thrd_func1(void *arg) B ⑥
{
arg arg
while(1)
{
sem_wait(&sem[1]) ⑦
printf(B\n) ⑧
sleep(1) ⑨
}
pthread_exit(NULL)
}
void *(*const func[THREAD_NUMBER])(void *){thrd_func0thrd_func1}
int main(void)
{
pthread_t thread[THREAD_NUMBER]
int no 0 res
void * thrd_ret
for (no 0 no < THREAD_NUMBER no++) ⑩
{
res pthread_create(&thread[no] NULL func[no] (void*)no)
}
printf(Create thread success\n Waiting for threads to finish\n)
for (no 0 no < THREAD_NUMBER no++)
{
sem_destroy(&sem[no])
}
return 0
}
(3)程序分析:
程序创建两线程实现A线程2秒印次字母AB线程秒印次字母B利步信号量输出字母B总A
① 创建线程0执行函数印字符’A’
② 印字符’A’
③ 信号量1进行V操作
④ 延时2s
⑤ 退出线程
⑥ 创建线程1执行函数印字符’B’
⑦ 信号量1进行P操作
⑧ 印字符’B’
⑨ 延时1s
⑩ 创建线程
(4)程序执行效果:
16八题
(1)通Makefileproject中c编译成ac调a函数求实现静态库生成调运行结果正确
(2)编写静态库程序threadc:
#include
void pf1(void)
{
printf(********\n)
return
}
void pf2(void)
{
printf(#########\n)
return
}
该程序定义两函数分印容该程序编译成a静态库
编写调程序callc:
extern void pf1(void)
extern void pf2(void)
int main(void)
{
pf1()
pf2()
return 0
}
该程序静态库进行调调静态库中两函数pf1pf2
编写Makefile:
CCgcc
CPPFLAGSc
OBJS threado
SOURCE threadc
CALL_SOURCEcallc
LIB libthreada
EXECcall
ARar
thread {OBJS}
{CC} c {SOURCE} o {OBJS}
{AR} rcsv (LIB) threado
{CC} o {EXEC} {CALL_SOURCE} L lthread
PHONY clean
clean
rm f {OBJS} {EXEC} {LIB}
Makefile文件实现静态库程序编译成a静态库编译调静态库程序callc执行文件call
(4)程序执行效果:
题目二 聊天程序设计
1.设计容求
11 聊天程序基求
1QT(miniGUI)编写聊天程序交叉编译载目标机实现两台目标机发送文聊天
2QT(miniGUI)界面设计少包括发送重置两钮求必须目标机硬件键盘映射QT设计软件界面中实现软件钮功
12 需实现功
(1) 客户端输入服务器IP端口号
(2) 服务器必须成功启动
(3) 客户端寻找服务器服务器建立连接
(4) 客户端服务器实现通信
(5) 通信容显示面板
(6) 利QT设计界面载MagicARM2410面
2.需求分析
21 QT设计
QT设计编写调试阶段周立功MagicARM2410箱子提供QT for PC编译器运行测试阶段QT for ARM编译器
QT for PC阶段编译程序步骤(编译hellocpp程序例):
(1)进入x86qtopia目录运行setenv脚设置环境变量
setenv
(2)进入hello目录然progen工具生成工程文件hellopro
cd hello
vi hellocpp
progen –t appt –o hellopro
(3)tmake工具生成hello工程Makefile文件
tmake o Makefile hellopro
(4)修改Makefile文件LIBS变量中增加需库然输入make命令编译
LIBS (SUBLIBS) L(QTDIR)lib lqte lm lstdc++
make
(5)启动虚拟控制台运行hello程序(机须启动帧缓必须够访问devfb0)
cd zylinuxx86qtopia
setenv
cd hello
hello –qws
果Hello程序发布MagicARM2410运行需进行工作:
(6)进入zylinuxarmqtopia目录hello工程复制前目录
cd zylinuxarmqtopia
cp –av zylinuxx86qtopiahello
(7)运行前目录setenv文件重新设置环境变量进入hello目录tmake工具重新生成Makefile文件
setenv
cd hello
tmake o Makefile hellopro
(8)步骤(4)方法修改包含库编译执行文件hellohello文件添加文件系统中更新文件系统
(9)插入USB鼠标USB键盘启动MagicARM2410启动Qtopia终端运行hello程序
利样编译方法客户端QT程序进行编译调试
211 客户端QT界面设计
客户端QT需基组件:
(1)两QEditLine输入服务器IP址(读写)输入服务器端口号(读写)
(2)三钮连接服务器发送消息清空发送区域数
(3)四标签显示组件容
(4)两MultiLineedit显示通信容(读)作发送区域(读写)
22服务器端客户端数传输方式
服务器端客户端数TCP套接字传输IP址表示Internet计算机端口号标识正计算机运行进程端口号IP址组合出网络套接字客户端linux C 函数socket建立服务器套接字连接
套接字连接socket建立利linux C语言中send函数recv函数实现简单发送接收消息
23 服务器端功设计
时间限服务器没QT编写界面实现简单控制程序服务器实现:
(1)创建套接字
(2)套接字IP址端口号进行绑定
(3)进行监听
(4)等客户端连接
(5)客户端接收发送数
24客户端功设计
客户端QT设计界面客户端实现功:
(1)创建套接字
(2)连接服务器
(3)服务器通信
3.总体设计
31 总体功
根需求做分析聊天程序需实现基功应包括方面:
(1) 客户端输入服务器IP端口号
(2) 服务器必须成功启动
(3) 客户端寻找服务器服务器建立连接
(4) 客户端服务器实现通信
(5) 通信容方便查
QT设计界面简洁方操作简单方便容易手户快速掌握操作流程
4 详细设计
41 功分析描述
聊天工具包括两功模块:客户端服务器端具体实现功创建套接字连接通信接收数显示发送数
42 客户端功模块
421 连接服务器
连接服务器前需解析服务器址创建套接字设置sockaddr_in 结构体中相关参数
422发送消息功
连接功开始聊天前必须进行步骤连接成功进行发送消息
发送消息功流程图图25示:
图25 发送消息功流程图
423接收消息模块
连接成功接收服务器发送数
43 服务器功模块
服务器设计没QT编写界面服务器端实现功:
图28 服务器模块流程图
5 代码实现
51 客户端代码
511 QT构造析构函数
EditDemoEditDemo( QWidget *parent const char *name)QWidget(parent name)
{
QGridLayout *grid new QGridLayout(this 6 3 0 0)
IP addr
QLabel *label1 new QLabel( IP Addr this)
grid>addWidget( label1 0 0 )
edit_ip new QLineEdit(this)
edit_ip>setText(127001)
grid>addWidget( edit_ip 0 1 )
Server Port
QLabel *label2 new QLabel( Server Port this)
grid>addWidget( label2 1 0)
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 mode
QLabel *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_contract31)
QLabel *label4 new QLabel( Send Area this)
grid>addWidget(label4 4 0)
multiedit_send new QMultiLineEdit(this)
grid>addWidget(multiedit_send41)
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) *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 socket\n)
}
}
512 创建套接字
void EditDemoCreateSocket(void)
{
*址解析函数*
host gethostbyname(edit_ip>text())
*创建socket*
sockfd socket(AF_INETSOCK_STREAM0)
*设置sockaddr_in 结构体中相关参数*
serv_addrsin_family AF_INET
serv_addrsin_port htons(atoi(edit_port>text()))
serv_addrsin_addr *((struct in_addr *)host>h_addr)
bzero(&(serv_addrsin_zero) 8)
}
513 创建线程
void *task(void *arg)
{
int recvbytes 0
char buf[BUFFER_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*
}
52 服务器端代码
#define PORT 4321
#define BUFFER_SIZE 1024
#define MAX_QUE_CONN_NM 5
int main()
{
struct sockaddr_in server_sockaddr client_sockaddr
int sin_size recvbytes
unsigned int sendbytes 0
int sockfd client_fd
char buf[BUFFER_SIZE]
*建立socket连接*
sockfd socket(AF_INETSOCK_STREAM0)
*设置sockaddr_in 结构体中相关参数*
server_sockaddrsin_family AF_INET
server_sockaddrsin_port htons(PORT)
server_sockaddrsin_addrs_addr INADDR_ANY
bzero(&(server_sockaddrsin_zero) 8)
int i 1* 重复址套接字进行绑定 *
setsockopt(sockfd SOL_SOCKET SO_REUSEADDR &i sizeof(i))
*绑定函数bind*
ibind(sockfd (struct sockaddr *)&server_sockaddr sizeof(struct sockaddr)
*调listen函数*
listen(sockfd MAX_QUE_CONN_NM)
*调accept函数等客户端连接*
client_fd accept(sockfd (struct sockaddr *)&client_sockaddr &sin_size)
*调recv函数接收客户端请求*
while(1)
{
memset(buf 0 sizeof(buf))
recvbytes recv(client_fd buf BUFFER_SIZE 0)
if(recvbytes > 0)
{
printf(Received a message s\n buf)
printf(Send a message s\n buf)
(sendbytes send(client_fd buf strlen(buf) 0)
}
}
close(sockfd)
exit(0)
}
6.功实现
7.总结
通次嵌入式linux程序设计编程linux编程更深解特QT编程进步通测试编写程序利运行时间紧迫服务器部分没QT设计界面编写客户端QT程序成功仿真运行
编写代码程中非常认真努力解决BUG
8.致谢
感谢学院次嵌入式linux课程设计机会时感谢帮组老师学
9.参考文献
[1] 嵌入式Linux应程序开发标准教程民邮电出版社华清远见嵌入式培训中心20107
[2] ZLG ARMMAGIC2410实验指导资料
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档