淮海工学院计算机工程学院课程设计报告书课程名:《Linux程序设计》题目:网络聊天室班级:软件132班成员:XXXXXXXXXX评语:成绩:指导教师:批阅时间:年月日1.绪论1.1背景Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux操作系统诞生于1991年10月5日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。1.2linux介绍基本思想Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。完全免费Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。完全兼容POSIX1.0标准这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。多用户、多任务Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。良好的界面Linux同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows图形界面的X-Window系统,用户可以使用鼠标对其进行操作。在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。支持多种平台Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux2.4版内核已经能够完全支持Intel64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。。2.需求分析2.1功能需求:项目基本功能:1.用户登录(不能重复登录)2.用户注册(不能重复注册)3.显示在线用户4.好友上下线提醒5.私聊6.群聊用户注册用户输入用户名和密码,提交给服务器确认,根据确认的信息判断用户是否符合注册条件。如果用户名和密码在用户信息组中不存在的话,则注册成功,跳转到首页。用户登录用户输入用户名和密码,提交给服务器确认,根据确认的信息判断用户是否符合登录条件。如果用户名和密码正确的话,则登录到模式选择界面。用户私聊用户成功进入聊天室后可选择单人聊天模式与在线的任一用户进行私聊,输入“用户名:”+私聊内容,enter键发送即可。用户群聊用户成功进入聊天室后可选择单人聊天模式与在线的任一用户进行私聊,输入“all:”+聊天内容,enter键发送即可。查看在线用户用户进入聊天室后系统会显示在线用户的姓名。好友上下线提醒用户成功进入聊天室后,好友上线和下线时,会收到系统提醒。聊天记录和用户信息系统后台可以查看所有用户的聊天记录和用户信息。3.应用技术3.1TCP和UDP通信的概念3.1.1UDP通信UDP是用户数据报协议的简称。它是以中午连接的逻辑通信信道。UDP在传送数据之前不需要先建立连接,远地主机的传输层在收到udp数据报后,不需要给出任何确认,所以不能保证其交付时可靠。它的特点是:因无连接,故提供的是不可靠的信道,但也是因无连接而具有很好的传输效率。3.1.2TCP通信TCP是传输控制协议的简称,它是提供一条全双工的、可靠的信道。TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播和多播服务。由于TCP要提供可靠的、面向连接的运输服务,所以不可避免地增加了许多系统开销,比如确认、流量控制、计时器以及连接管理等都需要占用许多系统的时空资源。两个计算机之间如果使用TCP通信,其连接过程需要三次握手实现,如实验图1-1所示。图1-1用三次握手建立TCP连接对于两个计算机之间连接的释放过程也需要类似的3次握手的互相确认的过程,如实验图1-2所示。图1-2TCP连接的释放过程3.2客户/服务器模型在客户/服务器模型中,多个相互通信的计算机都作为客户端,与网络服务器进行连接,并通过服务器进行信息的传递。所以多个客户端之间的通信就变为了客户端与服务端的通信。所以,采用客户/服务器模型进行网络聊天需要分别编写服务器端和客户端的程序,服务器和客户端之间相互通信的同步关系和各自的程序流程如实验图1-3所示。Socket()Bind()Listen()Accept()Read()Write()Read()Close()Tcp服务器Socket()Connect()Write()Read()Close()Tcp客户端阻塞直到有客户端连接建立连接请求数据回应数据结束连接处理请求图1-3Socket通信流程图3.3网络套接字(socket)的概念Socket接口上TCP/IP网络应用程序接口(API),它提供了许多函数和例程,程序员可以使用它们来开发TCP/IP网络应用程序。使用Socket接口进行网络通信的过程如图1-3所示,简要步骤如下:(1)建立一个Socket.(2)按要求配置socket,将socket连接到远程主机或给socket指定以各本地协议端口。(3)按要求通过socket发送和接受数据。(4)关闭此socket。这是通过Socket实现点对点通信需要掌握的4个编程要点。3.4多线程的概念上述点对点通信的实现知识完成了主机进程与服务器进程之间的连接,建立连接的进程之间是一对一的联系,即主机的一个进程与服务器的一个进程之间建立的连接。而每个进程进行通信的环节都包括了发送信息和接口信息两个任务,这两个任务通过一个端口地址发送和接收。对于多个并发的任务需要创建多个线程或线程去实现。使用一个进程去完成发送信息是没有问题的,因为发送总是主动的;而使用同一个进程再去完成接受信息去不一定会成功,因为接受信息是被动的,所以当没有信息可以接收时,该进程就会被阻塞,从而导致发送任务也一起被阻塞。同一个端口的发送和接收是两个并发任务,应该由两个不同的任务去分别完成信息的发送和接收。这样,当接收信息任务因没有信息而被阻塞时,不至于影响发送任务的执行。那么,发送和接收两个任务是使用两个进程还是两个进程去完成呢?在网络通信中,端口地址是以进程为单位进程分配的,而一个进程与外界的消息发送与接收必须通过分配给它的同一个端口进行。因此,不能通过创建进程方式来解决上诉问题,因为两个进程会分别对应两个不同的端口,而发送和接收必须使用同一端口。线程不是资源分配的单位,所以如果使用两个线程不会对线程分配新的端口。因此,本实验需要使用两个线程去分别完成发送和接收信息的任务,这两个线程共享其进程拥有的统一个端口地址。由于创建进程的进程本身会作为一个线程来调度,所以只需要再创建一个线程专门负责接收信息就可以了。因此,对于从每个客户端发来的请求,服务器端都要创建相应的线程去接收并处理;同理,对于客户端而言,也要创建一个线程去读取服务器端发来的信息。4.工作原理4.1Linux提供的有关Socket的系统调用(1)Socket()作用:socket函数为客户机或服务器创建一个sokcet格式:intsocket(intfamily,inttype,intprotocol);参数说明:Family:表示地址族,可以去AF_UNLX和AF_INT。其中,AF_UNLX只能够用于单一的UNIX系统进程间通信;AF_INT是针对Internet的,因而可以允许在远程主机之间通信,实验中使用AF_INT。Type:网络程序所采用的通信协议,可以取SOCK_STREAM或SOCK_DGRAM。其中,SOCK_STREAM表明使用的是TCP协议,这样提供按顺序的、可靠的、双向、面向连接的比特流;SOCKE_DGRAM表明使用的是UDP协议,这样只会提供定长、不可靠、无连接的通信。(2)bind()格式:intbind(intsockfd,structsockaddr*addr,intaddrlen);参数说明:Sockfd:socket的文件描述符号。Sockaddr:表示名字所用的一个数据结构,用来保存地址(包括IP地址和端口)Addrlen:设置结构大小长度。(3)listen()格式:intlisten(intsockfd,intbacklog);作用:监听连接信号,和accepted函数合同。参数说明:Sockfd:表示socket调用返回的文件描述符。Backlog:表示接入队列允许的连接数目,大多数系统允许20个,也可以子定义5~10个。(4)accept()格式:Intaccept(intsockfd,void*addr,int*addrlen);作用:与listen函数合用,监听信息、接收客户端请求。参数说明:Sockfd:表示socket的文件描述符。Addr:表示指向局部的数据结构structsockaddr-in的指针。Addrlen:表示地址的长度。(5)connect()格式:intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);作用:在面向连接的系统中客户及连接服务器时使用,connect必须在bind后使用。参数作用:Sockfd:表示socket的文件描述符。Serv-addr:表示村访目的端口和ip地址(套接字)的数据结构。(6)send()和recv()格式1:Intsend(intsockfd,constvod*msg,intlen,intflags);功能:发送信息。格式2:Intrecv(intsockfd,void*buf,intlen,usignedintflags);作用:用于流式socket、数据报socket内部之间的通信。(7)close()和shutdown()格式:Close(intsockfd)或Intshutdown(intsockfd,inthow);参数说明:How的值为下面一种:0----不允许继续接收;1----不允许继续发送;2---不允许继续发送和接收。(8)有关线程的系统调用函数pthread_create()、pthread_join()4.2实验过程说明(使用TCP/IP)(1)监听连接利用socket、bind、listen建立连接,步骤是:1)先用socket函数初始化socket,创建新的sockfd。Sockfd=socket(AF_INT,SOCK_STREAM,0)2)此步骤涉及到IP地址及其处理过程。参数说明:inet_addr函数INADDR_ANY该函数把由小数点分开的十进制IP地址转为unsingedlong类型,而在实验中所使用的为INADDR_ANY,使用利用自已的IP