Linux网络聊天系统.docx
- 文档编号:3310351
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:40
- 大小:255.10KB
Linux网络聊天系统.docx
《Linux网络聊天系统.docx》由会员分享,可在线阅读,更多相关《Linux网络聊天系统.docx(40页珍藏版)》请在冰豆网上搜索。
Linux网络聊天系统
Linux网络聊天系统
学院:
信自学院
班级:
计科092
学号:
200910405229
姓名:
指导教师:
前瞻
在网络无所不在的今天〖资料来源:
毕业设计(论文)网〗在Internet上,有ICQ、MSN、Gtalk、OICQ等网络聊天软件,极大程度上方便了处于在世界各地的友人之间的相互联系,也使世界好像一下子缩小了,不管你在哪里,只要你上了网,打开这些软件,就可以给你的朋友发送信息,不管对方是否也同时在线,只要知道他有号码。
Linux操作系统作为一个开源的操作系统被越来越多的人所应用,它的好处在于操作系统源代码的公开化!
只要是基于GNU公约的软件你都可以任意使用并修改它的源代码。
但对很多习惯于Windows操作系统的人来说,Linux的操作不够人性化、交互界面不够美观,这给Linux操作系统的普及带来了很大的阻碍。
因此制作一个Linux操作系统下的拥有人性化界面的实时通讯工具,将给那些刚刚接触Linux操作系统的用户带来极大的方便,而且通过设计这样的一个应用程序还能更好的学习网络编程知识和掌握LINUX平台上应用程序设计开发的过程,以达到检验学习成果的目的
本课程设计主要实现一个Linux下的局域网聊天工具的设计。
该设计主要分为两部分,客户端部分和主机部分。
运行服务器端程序可以和任意运行了客户端程序的主机进行通信,通信内容能够通过终端显示出来。
两个部分都使用C语言,利用vi编辑器,通过Socket套接口编程实现相关功能
本论文还设计了另一个网络聊天室程序,我们都知道网络聊天室是用户比较喜欢的一种应用程序,借助聊天室和他的留言系统,用户可以及时互通信息,交流思想。
本次设计的系统主要采用了基于C/S模式开发了简易聊天室系统,在终端字符界面,支持用户管理,用户名/密码注册和登录,客户端登陆到服务器聊天后,可以在聊天室内与其他用户交流(这个聊天室中的任何一个用户输入一段字符后,室内的其他用户都可以看到这句话)。
本设计使用网络套接字socket和多线程在网络中的应用,并基于linux下的vi编辑器。
本方案经gcc调试器调试成功,可以在单机网络聊天中使用。
一、shell编程
1、目的
为了巩固这个学期所学的linux操作系统中,对系统运行启动后的内存管理、进程管理、文件管理、设备管理等的了解和熟悉以及一些linux平台上的操作。
以下是两个Shell程序的练习。
2、实现过程
2.1cd、environ、exit指令
(1)源代码
#include
#include
#include
#include
#include
#include
#include
#include
#defineCMD_CD("cd")
#defineCMD_ENVIRON("environ")
#defineCMD_EXIT("exit")
voidPrint(void);
intInput(charch[10]);
voidCd(void);
voidEnviron(void);
intmain(void)
{
charch[1024];
system("clear");
printf("\n********Thisismyshell*****\n\n");
while
(1)
{
Print();
scanf("%s",ch);
Input(ch);
}
return0;
}
intInput(charcmd[1024])
{
if(cmd[0]=='\0'){
return0;
}elseif(strcmp(cmd,CMD_CD)==0){//strcmp(constchar*,constchar*)
Cd();
}elseif(strcmp(cmd,CMD_ENVIRON)==0){
Environ();
}elseif(strcmp(cmd,CMD_EXIT)==0){
printf("exitshell!
\nThankyou!
bye!
\n");
exit(0);
}
cmd=NULL;
return0;
}
voidPrint(void)
{
charCDMch[1024];
getcwd(CDMch,1024);
printf("%s$>",CDMch);
}
/*cd<目录>---更改当前的工作目录到另一个目录*/
voidCd(void)
{
intlen,i=0,k=0;
intj;
charpath[100];
chartemp[100];
fgets(path,100,stdin);
len=strlen(path);
while(path[i]=='')
i++;
for(j=0;j temp[j]=path[i]; i++; } while(temp[k]! ='\n') k++; temp[k]='\0'; if(chdir(temp)==0) { getcwd(temp,len-i); printf("changedworkpath: %s\n",path); } system("pwd"); } /*environ---列出所有的环境变量字符串的设置*/ voidEnviron(void) { externchar**environ; char**var; for(var=environ;*var! =NULL;var++) printf("%s\n",*var); } (2)运行截图 2.2echo、help、jobs、quit/exit/bye指令 源代码 #include #include #include #include #include #include #include #include #defineCMD_ECHO("echo") #defineCMD_HELP("help") #defineCMD_JOBS("jobs") #defineCMD_QUIT("quit") #defineCMD_EXIT("exit") #defineCMD_BYE("bye") voidPrint(void); intInput(charch[10]); voidEcho(void); voidHelp(void); voidJobs(void); intmain(void) { charch[1024]; system("clear"); printf("\n********Thisismyshell*****\n\n"); while (1) { Print(); scanf("%s",ch); Input(ch); } return0; } intInput(charcmd[1024]) { if(cmd[0]=='\0'){ return0; }elseif(strcmp(cmd,CMD_ECHO)==0){ Echo(); }elseif(strcmp(cmd,CMD_HELP)==0){ Help(); }elseif(strcmp(cmd,CMD_JOBS)==0){ Jobs(); }elseif(strcmp(cmd,CMD_BYE)==0||strcmp(cmd,CMD_QUIT)==0|| strcmp(cmd,CMD_EXIT)==0){ printf("exitshell! \nThankyou! bye! \n"); exit(0); } cmd=NULL; return0; } voidPrint(void) { charCDMch[1024]; getcwd(CDMch,1024); printf("%s$>",CDMch); } /*echo<内容>---显示echo(显示注释)后的内容且换行*/ voidEcho(void) { charcmd[1024]; intlen,i=0; fgets(cmd,1024,stdin); len=strlen(cmd); while(cmd[i]=='') i++; for(i;i printf("%c",cmd[i]); printf("\n"); } /*jobs输出shell---当前的一系列子进程,并提供进程的命名和PID号*/ voidJobs(void) { pid_tpid; pid=fork(); if(pid<0){ printf("forkerror\n"); exit(-1); }elseif(pid==0){ if(execvp("/bin/ps",NULL! =0)) switch(errno){ caseENOENT: printf("filenotfind\n"); break; caseEACCES: printf("youdonothaverighttoaccess\n"); break; default: printf("someerrorinexec\n"); } exit(-1); }else waitpid(pid,0,0); } /*help----输出shell的使用方法和基本功能*/ voidHelp(void) { printf("*************Theuseofshellandthebasicfunctions************\n"); printf("echo printf("help----------------------Outputmethodandbasicfunctionofshell\n"); printf("Jobsshell---outputcurrentaseriesofprocesses\n"); printf("quit/exit/bye-----------------------------exitshell\n"); } (2)运行截图 二、网络聊天室的设计 设计目的 由于Linux的开源的特点,越来越多的人转而使用Linux做为PC机的操作系统。 但是Linux的真正兴起只是在最近几年,因此很多功能并不是很完善,并且由于Linux的开源特征,很多软件开发公司很难从中获得直接利益,因此很多Windows上的实用的软件,在Linux下却很少见。 本课程设计正是为了解决Linux下局域网聊天问题而设计的,并且希望通过本课程设计可以更好的了解Linux操作系统的原理,进一步掌握vi,gcc等工具的使用,并且熟悉Linux下的网络编程,以及多线程编程。 linux介绍来源: Linux是一种自由和开放源码的类Unix操作系统。 目前存在着许多不同的Linux,但它们都使用了Linux内核。 Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。 Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。 严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。 Linux得名于计算机业余爱好者LinusTorvalds。 Linux操作系统是UNIX操作系统的一种克隆系统。 它诞生于1991年的10月5日(这是第一次正式向外公布的时间)。 以后借助于Internet网络,并经过全世界各地计算机爱好者的共同努力下,现已成为今天世界上使用最多的一种UNIX类操作系统,并且使用人数还在迅猛增长。 Linux操作系统的诞生、发展和成长过程始终依赖着以下五个重要支柱: UNIX操作系统、MINIX操作系统、GNU计划、POSIX标准和Internet网络。 Linux的基本思想有两点: 第一,一切都是文件;第二,每个软件都有确定的用途。 其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。 至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。 提到Linux我们不能不提GNU和Unix。 RichardM.Stallman建立的自由软件联盟出版了两种许可证,GNU通用公共许可证(GNUGneralPublicLicense,GPL)和GNU函数库通用公共许可证(GNULibraryGneralPublicLicense,LGPL)。 大部分GNU工程的软件和文档是以GNU通用公共许可证发行的,但是有一些库是以GNU函数库通用公共许可证发行的。 按照GNU通用公共许可证的规定,Linux的源代码可以自由获取,这满足了我们学习该系统的强烈愿望。 GPL充分体现了Stallman的思想: 只要用户所做的修改是同等自由的,用户可以自由地使用、拷贝、查询、重用、修改甚至发布这个软件。 通过这种方式,GPL保证了Linux(以及同一许可证下的大量其他软件)不仅现在自由可用,而且皮后经过任何修改这后都仍然可以自由使用。 Linux操作系统是UNIX操作系统的一个克隆版本。 UNIX操作系统是美国贝尔实验室的肯·汤普逊Ken.Thompson和丹尼斯·里奇DennisRitchie于1969年夏在DECPDP-7小型计算机上开发的一个分时操作系统。 当时KenThompson为了能在闲置不用的PDP-7计算机上运行他非常喜欢的星际旅行(Spacetravel)游戏,在1969年夏天乘他夫人回家乡加利福尼亚渡假期间,在一个月内开发出了unix操作系统的原型。 当时使用的是BCPL语言(基本组合编程语言),后经DennisRitchie于1972年用移植性很强的C语言进行了改写,使得UNIX系统在大专院校得到了推广。 1981年IBM公司推出微型计算机IBMPC。 在1981-1991年间MS-DOS操作系统一直是微机上操作系统的主宰。 此时计算机硬件价格虽逐年下降,但软件价格仍居高不下。 当时Apple的MACos操作系统可以说是性能最好的,但是其天价没人能够轻易靠近。 到1991年,GNU计划已经开发出了许多工具软件。 最受期盼的GnuC编译器已经出现,但还没有开发出免费的GNU操作系统。 即使是MINIX也开始有了版权,需要购买才能得到源代码。 而GNU的操作系统HURD一直在开发之中,但并不能在几年内完成。 对于Linus来说,已经不能等待了。 从1991年4月份起,他开始酝酿并着手编制自己的操作系统。 刚开始,他的目的很简单,只是为了学习Intel386体系结构保护模式运行方式下的编程技术。 但后来Linux的发展却完全改变了初衷。 1991年初,Linus开始在一台386sx兼容微机上学习minix操作系统。 通过学习,他逐渐不能满足于minix系统的现有性能,并开始酝酿开发一个新的免费操作系统。 根据Linux在comp.os.minix新闻组上发布的消息,我们可以知道他逐步从学习minix系统到开发自己的Linux的过程。 从1991年的4月份开始,Linus几乎花了全部时间研究386-minix系统(hackthekernel),并且尝试着移植GNU的软件到该系统上(GNUgcc、bash、gdb等)。 并于4月13日在comp.os.minix上发布说自己已经成功地将bash移植到了minix上,而且已经爱不释手、不能离开这个shell软件了。 第一个与Linux有关的消息是在1991年7月3日在comp.os.minix上发布的(当然此时还不存在Linux这个名称,当时Linus的脑子里想的可能是FREAX,FREAX的英文含义是怪诞的、怪物、异想天开等)。 其中透露了他正在进行Linux系统的开发,并且在Linux最初的时候已经想到要实现与POSIX(UNIX的国际标准)的兼容问题了。 在Linus的下一发布的消息中(1991年8月25日comp.os.minix),他向所有minix用户询问"Whatwouldyouliketoseeinminix? "("你最想在minix中见到什么? "),在该消息中他首次透露出正在开发一个(免费的)386(486)操作系统,并且说只是兴趣而已,代码不会很大,也不会象GNU的那样专业。 开发免费操作系统这个想法从4月份就开始酝酿了,希望大家反馈一些对于minix系统中喜欢那些特色不喜欢什么等信息,由于实际的和其它一些原因,新开发的系统刚开始与minix很象(并且使用了minix的文件系统)。 并且已经成功地将bash(1.08版)和gcc(1.40版)移植到了新系统上,而且再过几个月就可以使用了。 最后,Linus申明他开发的操作系统没有使用一行minix的源代码;而且由于使用了386的任务切换特性,所以该操作系统不好移植(没有可移植性),并且只能使用AT硬盘。 对于Linux的移植性问题,Linus当时并没有考虑。 但是目前Linux几乎可以运行在任何一种硬件体系结构上。 到了1991年的10月5日,Linus在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核系统的诞生(Freeminix-likekernelsourcesfor386-AT)。 这段消息可以称为Linux的诞生宣言,并且一直广为流传。 因此10月5日对Linux社区来说是一个特殊的日子,许多后来Linux的新版本发布时都选择了这个日子。 所以RedHat公司选择这个日子发布它的新系统也不是偶然的。 3.技术说明 3.1TCP、UDP协议的概念 UDP UDP是用户数据报协议的简称。 它是以中午连接的逻辑通信信道。 UDP在传送数据之前不需要先建立连接,远地主机的传输层在收到udp数据报后,不需要给出任何确认,所以不能保证其交付时可靠。 它的特点是: 因无连接,故提供的是不可靠的信道,但也是因无连接而具有很好的传输效率。 TCP TCP是传输控制协议的简称,它是提供一条全双工的、可靠的信道。 TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。 TCP不提供广播和多播服务。 由于TCP要提供可靠的、面向连接的运输服务,所以不可避免地增加了许多系统开销,比如确认、流量控制、计时器以及连接管理等都需要占用许多系统的时空资源。 两个计算机之间如果使用TCP通信,其连接过程需要三次握手实现,如实验图1-1所示。 三次握手建立TCP连接 对于两个计算机之间连接的释放过程也需要类似的3次握手的互相确认的过程 TCP连接的释放过程 3.2客户/服务器模型 在客户/服务器模型中,多个相互通信的计算机都作为客户端,与网络服务器进行连接,并通过服务器进行信息的传递。 所以多个客户端之间的通信就变为了客户端与服务端的通信。 所以,采用客户/服务器模型进行网络聊天需要分别编写服务器端和客户端的程序,服务器和客户端之间相互通信的同步关系和各自的程序流程如实验图1-3所示。 Socket通信流程图 3.3网络套接字(socket) Socket接口上TCP/IP网络应用程序接口(API),它提供了许多函数和例程,程序员可以使用它们来开发TCP/IP网络应用程序。 使用Socket接口进行网络通信的过程如图1-3所示,简要步骤如下: (1)建立一个Socket. (2)按要求配置socket,将socket连接到远程主机或给socket指定以各本地协议端口。 (3)按要求通过socket发送和接受数据。 (4)关闭此socket。 3.4多线程 上述点对点通信的实现知识完成了主机进程与服务器进程之间的连接,建立连接的进程之间是一对一的联系,即主机的一个进程与服务器的一个进程之间建立的连接。 而每个进程进行通信的环节都包括了发送信息和接口信息两个任务,这两个任务通过一个端口地址发送和接收。 对于多个并发的任务需要创建多个线程或线程去实现。 使用一个进程去完成发送信息是没有问题的,因为发送总是主动的;而使用同一个进程再去完成接受信息去不一定会成功,因为接受信息是被动的,所以当没有信息可以接收时,该进程就会被阻塞,从而导致发送任务也一起被阻塞。 同一个端口的发送和接收是两个并发任务,应该由两个不同的任务去分别完成信息的发送和接收。 这样,当接收信息任务因没有信息而被阻塞时,不至于影响发送任务的执行。 在网络通信中,端口地址是以进程为单位进程分配的,而一个进程与外界的消息发送与接收必须通过分配给它的同一个端口进行。 因此,不能通过创建进程方式来解决上诉问题,因为两个进程会分别对应两个不同的端口,而发送和接收必须使用同一端口。 线程不是资源分配的单位,所以如果使用两个线程不会对线程分配新的端口。 因此,本实验需要使用两个线程去分别完成发送和接收信息的任务,这两个线程共享其进程拥有的统一个端口地址。 由于创建进程的进程本身会作为一个线程来调度,所以只需要再创建一个线程专门负责接收信息就可以了。 因此,对于从每个客户端发来的请求,服务器端都要创建相应的线程去接收并处理;同理,对于客户端而言,也要创建一个线程去读取服务器端发来的信息。 4.系统的实现 4.1Linux提供的有关Socket的系统调用 (1)Socket() 作用: socket函数为客户机或服务器创建一个sokcet 格式: intsocket(intfamily,inttype,intprotocol); 参数说明: Family: 表示地址族,可以去AF_UNLX和AF_INT。 其中,AF_UNLX只能够用于单一的UNIX系统进程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 网络 聊天 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)