基于Linux系统移植的简易聊天.docx
《基于Linux系统移植的简易聊天.docx》由会员分享,可在线阅读,更多相关《基于Linux系统移植的简易聊天.docx(15页珍藏版)》请在冰豆网上搜索。
基于Linux系统移植的简易聊天
信息工程学院
嵌入式系统设计课程设计报告
题目
:
基于Linux系统移植的简易聊天
学号
:
学生姓名
:
专业名称
:
班级
:
目录
1.课题研究意义和现状-2-
1.1课题研究意义-2-
1.2课题研究现状-2-
2.系统总体方案设计-2-
2系统总体结构-2-
3.系统软件设计与实现-2-
3.1系统总流程图-2-
3.2客户端程序设计与实现-2-
3.3服务器程序设计与实现-2-
4.系统测试-2-
4.1系统软件测试-2-
4.2系统硬件测试-2-
5.总结和展望-2-
6.参考文献-2-
1.课题研究意义和现状
1.1课题研究意义
随着嵌入式在生活中的应用越来越广泛,嵌入式LINUX下的socket网络编程也越来越热门。
为了加强对Linux系统下的编程的各种知识点的整合与灵活应用,让我们更加熟悉linux下的编程操作,我们选择了Linux下简单聊天作为课设题目。
随着互联网技术的发展,互联网应用越来越丰富。
人们的联系方式也变得越来越多样化。
譬如在Internet上,有QQ、MSN、微信、微博等网络聊天软件,方便了距离相离很远是人们之间进行交流。
刚开始这些软件只是为了方便人们交流而开发的一种娱乐方式,但是随着发展和市场的需求,这些工具的功能多样化使得它们在市场上带来了很多的经济利益,因而使得聊天功能越来越强大。
作为一名即将毕业的大学生,可以通过这次的论文设计,巩固自己的C语言和数据结构知识,以及熟悉一个新系统Linux和Linux中的命令,socket编程,网络协议等等,更重要的是锻炼了自己动手编程能力和面对问题怎样去分析和解决的能力。
1.2课题研究现状
随着网络的发展,通信网络成为了我们现代社会发展的重要桥梁。
最近几年”云”一说法已经在人们的思想中成为一种定局,不管是有线还是无线,他们之间的网络通信将是人们很关注的问题。
由于网络通信的畅通,使得人们彼此之间的通信变得快捷和方便。
这是因为人类的需求,国内外出现了很多的聊天工具。
比如国内的QQ和国外的MSN,以及最近很红火的微信和facebook。
而对于QQ而言,它是以服务端作为中继并且接收客户端发来的信息,服务器总控制客户端,这样客户端之间就可以采用不面向连接的方式进行通信,提高效率。
当客户端之间没办法连接时,才由服务器进行中转通信。
在Internet网络上使用TCP/IP协议进行传输,要想客户端与客户端能进行正常的通信,他们彼此要和服务端先建立起连接,然后通过与服务器的TCP连接进行中转通信。
通过这两个具有代表性的聊天工具,可以看出根据自身情况,国内和国外研究的方向是有一定区别的。
由于套接字的类型还是比较多,所以在不同的操作系统中必须要有相应的套接字函数库。
除此之外由于不同商家为了获利,生产出各种有竞争的产品,导致市场上出现了不同型号的pc机,并且运用了不同的操作系统,这样就对通信带来了很大的麻烦,所以提出了tcp/ip协议来解决这样的问题。
以前几乎所有的套接字都是运用在windows系统下的,但是随着目前全球Linux系统开发的速度非常的快,使得socket套接字在linux系统中用的越来越多,其中以美国为首的发达国家最为积极。
由于linux在中国是最近几年的新词,所以中国的活跃程度相对还要低很多。
尽管活跃度较低,但是linux下的socket通信在各行各业中迅速成长起来。
由于网络的壮大,在Internet上通过网络通信会变得越来越复杂,所以在局域网内的通信在某些环境下将更受人们欢迎。
比如公司和学校的局域网通信,以及在相同局域网内的无线快速分配动态ip等。
2.系统总体方案设计
2系统总体结构
系统结构图如下:
互相交流
图2.1聊天模块划分图
3.系统软件设计与实现
3.1系统总流程图:
图3系统总流程图
3.2客户端程序设计与实现
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#definePORT15636
void*thread(void*vargp);
void*threadsend(void*vargp);
void*threadrecv(void*vargp);
intmain()
{
intlistenfd=socket(AF_INET,SOCK_STREAM,0);
if(listenfd<0){
perror("socket");
exit
(1);
}
structhostent*hp;
structsockaddr_inserveraddr;
bzero((char*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
serveraddr.sin_port=htons(PORT);
if(bind(listenfd,(structsockaddr*)&serveraddr,sizeof(serveraddr))<0){
perror("connect");
exit
(1);
}
if(listen(listenfd,1024)<0){
perror("listenerror");
exit
(1);
}
//chartemp[100];
structsockaddr_inclientaddr;
intclientlen,*connfdp;
clientlen=sizeof(clientaddr);
while
(1){
connfdp=(int*)malloc(sizeof(int));
*connfdp=accept(listenfd,(structsockaddr*)&clientaddr,&clientlen);
pthread_ttid;
printf("Accepted!
\n");
pthread_create(&tid,NULL,thread,connfdp);
}
EXIT_SUCCESS;
}
void*thread(void*vargp)
{
pthread_ttid1,tid2;
intconnfd=*((int*)vargp);
intidata;
chartemp[100];
pthread_create(&tid1,NULL,threadsend,vargp);
pthread_create(&tid2,NULL,threadrecv,vargp);
returnNULL;
}
void*threadsend(void*vargp)
{
intconnfd=*((int*)vargp);
intidata;
chartemp[100];
while
(1){
//printf("serverinput:
");
fgets(temp,100,stdin);
send(connfd,temp,100,0);
printf("serversendOK\n");
}
returnNULL;
}
void*threadrecv(void*vargp)
{
chartemp[100];
intconnfd=*((int*)vargp);
while
(1){
intidata=0;
idata=recv(connfd,temp,100,0);
if(idata>0){
printf("client:
\n%s\n",temp);
}
}
returnNULL;
}
3.3服务器程序设计与实现
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineMAXLINE100;
void*threadsend(void*vargp);
void*threadrecv(void*vargp);
intmain()
{
int*clientfdp;
clientfdp=(int*)malloc(sizeof(int));
*clientfdp=socket(AF_INET,SOCK_STREAM,0);
structsockaddr_inserveraddr;
structhostent*hp;
bzero((char*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(15636);
serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(connect(*clientfdp,(structsockaddr*)&serveraddr,sizeof(serveraddr))<0){
printf("connecterror\n");
exit
(1);
}
pthread_ttid1,tid2;
printf("connected\n");
while
(1){
pthread_create(&tid1,NULL,threadsend,clientfdp);
pthread_create(&tid2,NULL,threadrecv,clientfdp);
}
returnEXIT_SUCCESS;
}
void*threadsend(void*vargp)
{
//pthread_ttid2;
intconnfd=*((int*)vargp);
intidata;
chartemp[100];
while
(1){
//printf("me:
\n");
fgets(temp,100,stdin);
send(connfd,temp,100,0);
printf("clientsendOK\n");
}
printf("clientsend\n");
returnNULL;
}
void*threadrecv(void*vargp)
{
chartemp[100];
intconnfd=*((int*)vargp);
while
(1){
intidata=0;
idata=recv(connfd,temp,100,0);
if(idata>0){
printf("server:
\n%s\n",temp);
}
}
returnNULL;
}
4.系统测试
4.1系统软件测试
图4.1虚拟机运行图
4.2系统硬件测试
图4.21硬件测试图1
图4.22硬件测试图2
5.总结和展望
过本次的课程设计对linux模拟网络聊天的设计,自己从中学习到了很多知识和经验,同时把我大学的Linux知识通过这次设计重新好好的巩固了一遍,更重要的是,通过这次课程设计大大的增加了编程能力。
这次设计是在linux系统下实现的,所以通过这次设计的时间加深对linux系统认识以及其各种软件和命令的熟悉运用。
这次由于时间的原因我的设计的功能比较简单,还可以进一步改善其功能。
但是通过这次简单的基本设计,是我意识到在以后的工作中还要不断完善自己的知识体系结构,扩大自己的知识面,思考问题更加全面。
在本次设计中,我学会了很多东西。
让我知道当遇见困难时,自己首先必须得静下心来分析问题,然手通过查相关信息或者询问老师同学来解决这个问题。
还有就是要转变学校里面的观念,不要死搬书上的知识,要学会灵活应用,这样才能迅速掌握新知识。
6.参考文献
[1]江国星.一个基于Client/Server模型的网络应用模式[J].华中理工大学,2004.
[2]严蔚敏.吴伟民.数据结构(c语言版).清华大学出版社,2007.
[3]Linux下的c语言库函数.chm
[4]LinuxC函数库参考手册徐千洋中国青年出版社2002.1.
[5]谭浩强.C程序设计.清华大学出版社,2005
[6]赵敏哲.64位Linux操作系统与应用实例.北京:
机械工业出版社,2001.