Linux聊天室系统期末大作业
Linux期末大作业

简单的IRC聊天程序—— Linux课程期末实验第一章概述【实验目的】综合应用Linux系统下的网络编程技术,使用C语言,结合软件工程思想,设计并实现一个简单的IRC聊天程序,具有服务器端和客户端,可以是终端字符界面,支持用户管理,用户名/密码注册和登录,支持版面聊天,用户可以选择进入某个版面,版面发言大家可以看到,同时支持点对点私聊,可以选择某个用户进行私聊。
从而熟悉在Linux系统所提供的网络通信接口及该系统下的编程思想,深入对计算机系统的理解,并切实提高软件设计开发的能力。
【实验原理】一个简单的聊天室,其功能是当这个聊天室中的任何一个用户输入一段字符后,室内的其他用户都可以看到这句话。
据此,聊天程序分为客户端和服务器端。
客户端对应每一个参加聊天的用户,完成从终端上输入采集并传递到服务器端和从服务器端接收信息输出显示的功能。
总体介绍该结构如下。
首先是初始化服务器,使服务器进入监听状态:sockfd = socket(AF_INET, SOCK_STREAM, 0);// 首先建立一个socket,族为AF_INET,类型为SOCK_STREAM。
// AF_INET = ARPA Internet protocols,即使用TCP/IP协议族。
// SOCK_STREAM类型提供了顺序的,可靠的,基于字节流的全双工连接。
// 由于该协议族中只有一个协议,因此第三个参数为0。
bind(sockfd, (struct sockaddr *)&servaddr,sizeof(serv_addr));// 再将这个socket与某个地址进行绑定。
// serv_addr 包括sin_family=AF_INET 协议族同socket。
// sin_addr.s_addr = htonl(INADDR_ANY)服务器所接收的所有其他地址// 请求建立的连接。
// sin_port = htons(SERV_TCP_PORT) 服务器所监听的端口。
Linux期末考试试题6答案.docx

Linux 期末考试试题(六)、选择题 (每小题1分,共20分)1.在Vi 编辑器里,命令"dd"用来删除当前的()oA. 行B.变量C.字D.字符 2.当运行在多用户模式下时,用Ctrl+ALT+F*可以切换多少虚拟用户终端()。
A. 3B. 6C. 1D. 123. 在下列分区中,Linux 默认的分区是()。
A. FAT32B. EXT3 C FAT D. NTFS 4.按下( )键能终止当前运行的命令A. Ctrl-CB. Ctrl-FC. Ctrl-BA. :wqB. :wq!C. :q!D. :quit11. 以长格式列目录时,若文件test 的权限描述为:drwxrw-r —,则文件test 的类型及文件主的权限是()。
A.目录文件、读写执行B.目录文件、读写C.普通文件、读写D.普通文件、读12. 当字符串用单引号(,')括起来时,SHELL 将( )。
5. 下面哪个命令用来启动X-Window (A. runxB. StartxC.startx6. 若要将鼠标从VM 中释放出来,可按(A. Ctrl + AltB. Ctrl +Alt +DelC. Ctrl7.用"rm -i",系统会提示什么来让你确认(A.命令行的每个选项B.是否真的删除 &以下哪个命令可以终止一个用户的所有进程(A. skillallB. skill9. 在 Red Hat Linux 9 中,一般用(A. pingB.ipconfig10. vi 中哪条命令是不保存强制退出( )。
D. xwin)键来实现 +Alt +Enter D. Ctrl +Enter )? C.是否有写的权限D.文件的位置)oD. killall)命令来查看网络接口的状态C. winipcfgD. ifconfig)=C.killD. Ctrl-D16.用于文件系统直接修改文件权限管理命令为()oA. chown C. chmod A. kill -9B.kill -15C.killall -1D. kill -3 18. 用来分离目录名和文件名的字符是()?A. dash (-)B. slash (/)C. period (.)D. asterisk (*)19.系统的配置文件在( )目录下A. /homeB. /devC. /etcD. /usr 20. Linux9. 0 下主要用哪个 shell?()。
1inux期末试题及答案

1inux期末试题及答案LINUX期末试题及答案第一部分:单选题(共30题,每题2分,共60分)1. 以下哪个命令用于查看当前目录下的文件列表?A. lsB. cdC. mvD. rm答案:A2. 下面哪个选项是正确的文件权限设置?A. drwx-wx-wxB. rwxr-xr--C. -r--r--r-D. drw-rw-rw-答案:B3. 在Linux中,用于压缩文件的命令是?A. gzipB. tarC. zipD. unzip答案:B4. 下面哪个命令可以用于查看文件内容?A. catB. cpC. grepD. chmod答案:A5. 在Linux中,用于修改文件所属用户的命令是?A. chownB. chmodC. chgrpD. cut答案:A...第二部分:填空题(共10题,每题4分,共40分)1. 写出Linux系统的重要特性:_____________答案:开放源代码、多用户多任务、安全性强、稳定性高等(可任选一个特性进行填写)2. 命令_________用于显示当前用户所在的目录。
答案:pwd...第三部分:应用题(共3题,每题20分,共60分)1. 请编写一个Shell脚本,用于统计某个目录下文本文件的行数、字符数和单词数。
答案:```shell#!/bin/bashecho "请输入目录路径:"read pathif [ -d "$path" ]thenfor file in $path/*.txtdolines=$(wc -l < "$file")chars=$(wc -m < "$file")words=$(wc -w < "$file")echo "文件名:$file"echo "行数:$lines"echo "字符数:$chars"echo "单词数:$words"doneelseecho "目录不存在!"fi```...第四部分:论述题(共2题,每题30分,共60分)1. 简要介绍Linux操作系统的发展历程。
linux操作系统期末考试试题及答案

linux操作系统期末考试试题及答案一、选择题(每题2分,共20分)1. 以下哪个命令可以查看Linux系统的发行版信息?A. cat /etc/issueB. cat /etc/redhat-releaseC. cat /etc/debian_versionD. lsb_release -a答案:A2. 在Linux系统中,以下哪个命令可以用来查看文件权限?A. ls -lB. ls -aC. ls -rD. ls -t答案:A3. 以下哪个命令用于创建一个新的用户?A. useraddB. userdelC. groupaddD. groupdel答案:A4. 在Linux系统中,以下哪个命令可以用来查看系统运行时间?A. uptimeB. topC. psD. free答案:A5. 以下哪个命令可以用来查看系统负载?A. uptimeB. topC. psD. free答案:A6. 以下哪个命令可以用来挂载一个USB设备?A. mountB. umountC. mountpointD. mount | grep答案:A7. 以下哪个命令可以用来查看网络连接信息?A. ifconfigB. ipconfigC. netstatD. ping答案:C8. 以下哪个命令可以用来重启Linux系统?A. rebootB. shutdown -rC. shutdown -hD. init 6答案:A9. 以下哪个命令可以用来杀死一个进程?A. killB. pkillC. killallD. kill -9答案:A10. 在Linux系统中,以下哪个文件包含了系统环境变量?A. /etc/profileB. /etc/bash.bashrcC. ~/.bashrcD. /etc/environment答案:D二、填空题(每题2分,共20分)11. 在Linux系统中,文件权限分为三种类型:读(______)、写(______)和执行(______)。
linux期末考试题及答案

linux期末考试题及答案Linux期末考试题及答案一、选择题(每题2分,共20分)1. Linux操作系统属于以下哪种类型?A. 单用户单任务操作系统B. 多用户多任务操作系统C. 单用户多任务操作系统D. 多用户单任务操作系统答案:B2. 在Linux系统中,以下哪个命令用于查看当前目录下的文件和文件夹?A. lsB. pwdC. cdD. mkdir答案:A3. 如果需要查看一个文件的内容,但不修改它,可以使用以下哪个命令?A. catB. viC. rmD. mv答案:A4. 在Linux中,以下哪个命令可以显示当前系统的运行时间、用户数、系统负载等信息?A. topB. psC. uptimeD. who答案:C5. Linux系统中的文件权限分为哪三类?A. 可读、可写、可执行B. 可读、可写、可删除C. 可读、可写、可链接D. 可读、可写、可打印答案:A...20. 在Linux系统中,以下哪个命令用于解压tar.gz格式的压缩文件?A. tar -xzvfB. gzip -dC. gunzipD. tar -zxvf答案:D二、填空题(每空2分,共20分)1. Linux系统中的文件系统是以_________为节点组织的。
答案:inode2. 在Linux中,使用_________命令可以切换到root用户。
答案:su3. 要查看当前路径,可以使用命令_________。
答案:pwd4. 如果需要递归地复制一个目录到另一个位置,并覆盖原有文件,可以使用命令_________。
答案:cp -r5. 在Linux中,文件权限的数字表示方法中,7表示_________。
答案:可读可写可执行...10. 使用_________命令可以查看当前系统的磁盘使用情况。
答案:df三、简答题(每题10分,共30分)1. 简述Linux系统中的文件类型有哪些,并给出每种类型的代表字符。
答案:Linux系统中的文件类型主要有以下几种:- 普通文件:-- 目录:d- 符号链接:l- 块设备文件:b- 字符设备文件:c- 管道:p- 套接字:s2. 解释什么是Linux的硬链接和软链接,并说明它们的区别。
Linux期末考试试卷试题8套含答案.doc

往年复习题一、选择题:1.以下哪一个是linux 内核的稳定版本( B )A.2.5.24 B. 2.6.17 C. 1.7.18 D. 2.3.202.怎样显示当前目录( A )。
A. pwdB. cdC. whoD. ls3.欲把当前目录下的file1.txt 复制为file2.txt ,正确的命令是( D )。
A. copy file1.txt file2.txtB. cp file1.txt | file2.txtC. cat file2.txt file1.txtD. cat file1.txt > file2.txt4.如果您想列出当前目录以及子目录下所有扩展名为“.txt的”文件,那么您可以使用的命令是( B)。
A. ls *.txtB. find . – name “ .txt C”.ls –d .txt5.如何删除一个非空子目录/tmp(B)。
A. del /tmp/*B. rm -rf /tmpC. rm -Ra /tmp/*6.存放用户帐号的文件是(C)。
D. find .“ .txt D. rm –rf /tmp/*”A. shadowB. groupC. passwdD. Gshadow7. 下面哪个系统目录中包含Linux 使用的外部设备( B )。
A. /bin8.一个文件名字为A. tar B. /dev C. /boot D. /homerr .Z ,可以用来解压缩的命令是(D)B. gzippressD.uncompress9.Linux 通过VFS 支持多种不同的文件系统。
Linux 缺省的文件系统是( C )A.VFAT B. ISO9660 C.Ext 系列 D. NTFS 10.在vi 编辑器中的命令模式下,键入( B )可在光标当前所在行下添加一新行A.O B. o C. i D. a 11.在 vi 编辑器中的命令模式下,重复上一次对编辑的文本进行的操作,可使用( C)命令。
(完整版)Linux操作系统期末练习题最终版by枫叶
1.在Linux目录结构中目录中的文件是普通用户可以使用的可使用的可执行文件的目录是(B)19A./sbin B./bin C./usr D./lib2.在Linux目录结构中Linux的内核及引导程序所需要的文件位于(B)目录A./binB./bootC./rootD./proc3.在Linux目录结构中用来存放系统配置文件(D)目录A./libB./devC./procD./etc4.Linux三种特殊权限中仅用于目录文件的权限是(C)22A.SUIDB.SGIDC.黏滞位D.都可以5.Linux三种权限中允许进入目录的权限(C) 22A.r-可读B.w-可写C.x-可执行D.都不是6.下列脚本文件最先自动执行的是(A)24A./etc/rc.localB./etc/profileC.~/.bashrcD.~/.bash_logout7.下面通配符可匹配多个任意字符的通配符是(A)29A.*B. ?C.[abcde ]D.[!a-e]8.输出重定向符号右边的文件已经存在,不会覆盖文件而是追加的定向符是(B)A.>B.> >C. 2>D.&>9.表示用户家目录的是(B)A./home (所有用户家目录的父目录,+用户名才是用户家目录)B.~C. .D. ..10.可删除非空目录及其子目录的命令是(B)A. touchB.rm -rC.mkdirD.rmdir空目录11. 是强引用的符号(A)A. 单引号B.反引号C.双引号D.中括号12.可显示隐藏文件的ls命令形式选项是(A)A. ls -aB. ls -dC.ls -h D .ls -l13.可通过接受标准输入作为输出内容来创建简单文件的命令是(B)42A.touchB.catC.viD. gedit14.不带有编辑功能但有翻页、按行滚动、搜索功能的命令是(B)43A.catB.more和lessC.head 和tail D vi15.wc命令可统计文件的行数、字数和字节数。
linux期末大报告
Linux程序设计期末大作业报告学院:专业:年级:级学生姓名:学生学号:任课教师姓名:任课教师职称:讲师摘要●对linux的简单认识操作系统是计算机最重要的系统软件,是计算机应用的基础.Unix系统是迄今为止最优秀的操作系统,虽历经几十年,有许多变化,但基本的体系结构保持稳定。
Linux是一种自由和开放源码的类Unix操作系统。
目前存在着许多不同的Linux,但它们都使用了Linux 内核。
Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。
Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。
●作业简要概述本课程大作业共有两个题,一个是shell编程,如实现自己模拟shell下的cd、ls 指令等,要求说明程序主要功能,每行给出注释;另一题是一个二选一,选择了简单的聊天室程序设计,该题要求设计并实现简单的聊天室程序,可以是终端字符界面,支持用户管理,用户名/密码注册和登录,客户端登陆到服务器聊天后,可以在聊天室内与其他用户交流(这个聊天室中的任何一个用户输入一段字符后,室内的其他用户都可以看到这句话)。
据此,聊天程序分为客户端和服务器端。
客户端对应每一个参加聊天的用户,完成从终端上输入采集并传递到服务器端和从服务器端接收信息输出显示的功能。
在实验报告中针对代码给出了对应的注释和自己的理解。
关键字:Linux;shell编程;聊天室程序2目录摘要........................................................................................................... 2目录........................................................................................................... 3一、期末大作业的目的 .............................................................................. 4二、大作业的基本要求 .............................................................................. 4三、大作业内容......................................................................................... 41、作业题目一............................................................................................................................. 4shell编程1 ............................................................................................................................. 4shell编程2 ............................................................................................................................. 62、作业题目二............................................................................................................................. 8程序代码 ................................................................................................................................... 8运行截图 ............................................................................................................................... 15四、小结(设计中的优点、不足及改进).............................................. 17五、参考文献....................................................................................... 19大作业评分表 ........................................................................................ 203一、期末大作业的目的《Linux程序设计》大作业是在完成理论课程学习之后,通过大作业的方式对学生进行综合实践考核,在学生掌握Linux的基本编程知识及常用的操作命令基础上,提高学生对所学知识的应用能力,特别是:煅炼学生搜集有关Linux资料,在资料文档的帮助下,运用Linux的基本知识及常用的操作命令来解决问题的能力。
《linux操作系统》期末试卷A及答案
《linux操作系统》期末试卷A及答案《Linux操作系统》期末试卷A及答案第一章:Linux操作系统概述⑴操作系统概述- 操作系统的定义和作用- 操作系统的分类及特点- Linux操作系统的历史和发展⑵ Linux操作系统的特点- 开源性质和GPL许可证- 多用户、多任务和多线程- 稳定性和安全性第二章:Linux安装与配置⑴安装Linux操作系统- 硬件要求和准备工作- 安装媒体的选择和准备- 安装过程的详细步骤⑵ Linux系统配置- 用户和组的管理- 网络配置和用户环境配置- 服务配置和文件系统管理第三章:Linux基本命令⑴ Linux命令的基本格式和使用方法- 命令的结构和参数选项- 文件和目录操作命令- 用户和权限管理命令⑵ Linux文件系统- 文件系统的组成和层次结构- 文件和目录的权限和属性- 文件系统的挂载和管理第四章:Linux系统管理与优化⑴进程管理- 进程的概念和类型- 进程状态和管理- 进程调度和监控⑵系统资源管理与优化- CPU和内存管理- 磁盘和文件系统的管理- 网络和用户资源的管理第五章:Linux网络与安全⑴网络配置和管理- TCP/IP协议和网络模型- IP地质和子网掩码的配置- 网络连接和路由设置⑵ Linux安全管理- 用户和访问控制- 防火墙和网络安全- 漏洞扫描和管理《Linux操作系统》期末试卷A答案:第一章:Linux操作系统概述⑴操作系统概述- 操作系统的定义和作用:操作系统是计算机系统中的核心软件,负责管理和控制硬件资源,为用户和应用程序提供服务。
- 操作系统的分类及特点:常见的操作系统分类有Windows、Linux、Unix等。
操作系统的特点包括多用户、多任务和多线程等。
- Linux操作系统的历史和发展:Linux操作系统最早由Linus Torvalds开发,是一款开源的操作系统,经过多年的发展和完善,成为全球最受欢迎的服务器操作系统之一。
Linux操作系统期末综合练习
上机练习1.全部操作要求在虚拟终端窗口下完成,不允许在图形界面方式下操作。
2.将每道题的操作结果的主要画面,用“截图工具”选取你的主要操作画面,粘贴到WORD文档中对应题目的文字后。
3.最后将该word文件名修改成你自己的学号姓名:如20160549131李四.doc。
一、基本命令操作1.切换到虚拟终端窗口,以管理员用户登陆2.修改主机标识为你的名字的汉语拼音3.在root用户的宿主目录下创建子目录:mytest。
[root@xuechenqi ~]# cd ..[root@xuechenqi /]# mkdir mytest4.将/etc/目录下文件:profile和inittab复制到mytest中。
[root@xuechenqi ~]# cp /etc/profile /root/mytest[root@xuechenqi ~]# cp /etc/inittab /root/mytest[root@xuechenqi ~]# ll /root/mytest5.将mytest目录下的profile文件内容用重定向方式添加到inittab文件尾部。
[root@ xuechenqi mytest]# cat profile >> inittab6.用vim编辑mytest目录中profile文件的内容:将第10-20行的内容复制到文件尾部,然后保存退出。
[root@ xuechenqi mytest]# vim profile:set number 显示行号:10,20 co 23:wq7.分别显示/etc目录中shadow文件的内容文件前2行和后5行的内容。
[root@xuechenqi mytest]# head -n 2 /etc/shadow[root@xuechenqi mytest]# tail -n 5 /etc/shadow8.将/etc目录中的扩展名为conf的全部文件压缩成:conf.tar.bz2文件,保存在/tmp目录中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NANCHANG UNIVERSITY 《Linux系统编程》课程设计题目:Linux聊天室报告学院:软件学院专业:计算机软件班级:计软121班姓名:李俊楠起讫日期:2014. 12. 22—2015.1. 10任课教师:陈悦完成时间:2015年1月10日前填表日期:2015 年 1 月 6 日目录1、需求分析 (3)1.1项目介绍(50分) (3)1.2 功能需求 (3)2、系统分析 .............................................................. 错误!未定义书签。
2.1 本程序需解决的有关技术问题 (4)2.2 程序流程…………………………………………………………错误!未定义书签。
3、系统测试 (8)3.1 运行截图 (8)3.2 程序代码…………………………………………………………4、小结: (1)5、参考文献 (1)一、需求分析1.1 项目介绍1.1.1介绍本设计主要实现一个Linux下的局域网聊天工具的设计。
该设计主要分为两部分,客户端部分和服务器部分。
设计并实现一个简单的聊天室程序,可以是终端字符界面,支持用户管理,用户名/密码注册和登录,客户端登陆到服务器聊天后,可以在聊天室内与其他用户交流(这个聊天室中的任何一个用户输入一段字符后,室内的其他用户都可以看到这句话)。
据此,聊天程序分为客户端和服务器端。
客户端对应每一个参加聊天的用户,完成从终端上输入采集并传递到服务器端和从服务器端接收信息输出显示的功能。
1.1.2程序应满足如下要求:1.必须出现多线程;2.程序中要具备文件读取和写入的操作;3.在程序中必须使用网络通信进行信息传输;4.要求程序具备简单的菜单功能,根据用户的输入,执行相应的操作,在菜单界面,必须显示程序的名称、版本信息,开发者的名字、班级、学号等信息。
1.2 功能需求(1)客户端输入服务器IP和端口号(2)服务器成功启动(3)每个客户端可以找到服务器,并可以与服务器进行连接(4)客户端与服务器可以实现通讯二、系统分析2.1 本程序需解决的有关技术问题2.1.1 字符串的判断写一个脚本,检测用户输入串的合法性,要求串由大小写字母、数字组成,无标点、特殊符号、空格。
思路:将输入的串中非字母数字的内容删除或替换为空后若和原来输入的相同则合法,否则不合法。
#!/bin/bashisvalidAlphaNum(){compressed="$(echo $1 | sed 's/[^[:alnum:]]//g')" #替换不合要求字符为空if [ "$compressed" != "$1" ] ; thenreturn 1 # not valideelsereturn 0 # validefi}#函数体,判断字串的合法性echo -n "Enter input:" # -n 强制不换行read input #读取内容存到input中,无$ 符号if ! isvalidAlphaNum "&input" ;then #加引号,否则可能会出错。
echo "invalide"exit 1elseecho "valide"fiexit 0运行截图:2.1.2 月份的截取转换输入一个“month day year”格式的日期串,程序将处理” month”为其英文单词的前三个字母,第一个字母大写,其余的小写。
思路:首先判断month是数字、还是单词,若是数字,则可查“数字—month”映射表(自定义case结构);若是单词,则取前三个字母,并格式化。
#!/bin/bashmonthnoToName(){case $1 in1 ) month="Jan" ;;2 ) month="Feb" ;;3 ) month="Mar" ;;4 ) month="Apr" ;;5 ) month="May" ;;6 ) month="Jun" ;;7 ) month="Jul" ;; 8 ) month="Aug" ;;9 ) month="Sep" ;; 10) month="Oct" ;;11) month="Nov" ;; 12) month="Dec" ;;* ) echo "$0: Unknown numeric month value $1" >&2; exit 1 # default,esac #return 0}if [ $# -ne 3 ] ; then #若参数个数不为3,则有误echo “Usage:$0 month day year”exit 1fi#判断参数1是数字还是单词,方法替换串中所有数字,若结果为空,则为数字,否则为单词。
if [ -n $(echo $1 | sed ‘s/[[:digit:]]//g’) ] # -n 检测串是为空thenmonthnoToName $1 # 数字else# 取第一个字母并将其变为大写,再将结果与取出的第二三字母组合month=”$(echo $1 | cut –c1 | tr '[:lower:]' '[:upper:]')“month=”$month$(echo $1 | cut -c2-3 | tr '[:upper:]' '[:lower:]')”fiecho $month $2 $3 # 输出结果exit 0运行截图:2.2 程序流程(1)连接服务器连接服务器之前需要解析服务器地址,创建套接字,设置相关参数。
(2)发送消息功能(3)服务器功能模块三、系统测试3.1 运行截图服务器端运行截图客户端登陆,输入昵称和密码,文件的写入加入两名聊天人聊天信息,双方接收3.2 程序代码(1)客户端代码#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define TRUE 1#define PORT 1000static int sockfd;void recvfromserver() //接受服务器消息线程入口函数{char mes[1024];int nbytes=0;while(1){memset(mes,0,sizeof(mes));nbytes=read(sockfd,mes,sizeof(mes));if(nbytes>0){mes[nbytes]='\0';printf("%s\n",mes);}}pthread_exit(NULL);}int main(int argc, char *argv[]){// int sockfd;char buffer[1024];struct sockaddr_in server_addr;struct hostent *host;int portnumber,nbytes;char *strhost="127.0.0.1";char clientname[20];char password[20];char mes[1024];int thr_id; /* thread ID for the newly created thread */ pthread_t p_thread; /* thread's structure */ if(argc!=1){fprintf(stderr,"Usage:%s \a\n",argv[0]);exit(1);}if((host=gethostbyname(strhost))==NULL){fprintf(stderr,"Gethostname error\n");exit(1);}/* 客户程序开始建立sockfd 描述符*/printf("Creating the Set interface...n");if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));exit(1);}/* 客户程序填充服务端的资料*/bzero(&server_addr,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);server_addr.sin_addr=*((struct in_addr *)host->h_addr);printf("The successful landing\nWelcome to zhe chat room!\n");/* 客户程序发起连接请求*/if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1){fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));exit(1);}/* 连接成功了*/printf("The successful landing\nWelcome to zhe chat room!\n");printf("Please enter your nickname:\n");scanf("%s",clientname);printf("Please enter your password:\n");scanf("%s",password);printf("\nThe successful landing");// write(sockfd,clientname,sizeof(clientname));printf("\nNow you can chat with others!£¨\"Quit\"CUT DOWN LANDING\n\n");thr_id = pthread_create(&p_thread, NULL, recvfromserver, NULL);while(1){memset(buffer,0,sizeof(buffer));memset(mes,0,sizeof(mes));scanf("%s",buffer);strcat(mes,clientname);strcat(mes,":");strcat(mes,buffer);// printf("main thread %s\n",mes);if((write(sockfd,mes,sizeof(mes)))==-1){fprintf(stderr,"Write Error:%s\n",strerror(errno));exit(1);}if(strcmp(buffer,"Quit")==0){break;}}/* 结束通讯*/close(sockfd);exit(0);}(2)服务器代码#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define MAXLINE 1000 //在一条消息中最大的输出字符数#define LISTENQ 20 //最大监听队列#define PORT 1000 //监听端口#define MAXFD 20 //最大的在线用户数量void *get_client(void *);int sockfd,i;static int maxi=0;//maxi表示当前client数组中最大的用户的i值static int client[MAXFD];void recvandsend(void) //监听转发线程入口函数{int index=0;int nbytes=0;char buffer[1024];int len;int outindex=0;while(1){if(maxi>0){memset(buffer,0,sizeof(buffer));nbytes=0;//index++;nbytes=read(client[index++],buffer,sizeof(buffer));// printf("%d,%d\n",index,client[index]);if(nbytes>0){buffer[nbytes]='\0';printf(" %s\n",buffer);outindex=0;while(outindex<maxi)if(write(client[outindex++],buffer,sizeof(buffer))==-1){fprintf(stderr,"Write Error:%s\n",strerror(errno));exit(1);}}}if(index>=maxi)index=0;}pthread_exit(NULL);}int main(int argc, char *argv[]){// int client_fd[LISTENQ],clientnum=0;;struct sockaddr_in server_addr;struct sockaddr_in client_addr;int sin_size,portnumber;char hello[]="Hello! Are You Fine?\n";int thr_id; /* thread ID for the newly created thread */pthread_t p_thread; /* thread's structure */ int new_fd=0;memset(client,0,sizeof(client));if(argc!=1){fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);exit(1);}/* 服务器端开始建立socket 描述符*/if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){fprintf(stderr,"Socket error:%s\n\a",strerror(errno));exit(1);}/* 服务器端填充sockaddr 结构*/bzero(&server_addr,sizeof(struct sockaddr_in));server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=htonl(INADDR_ANY);server_addr.sin_port=htons(PORT);/* 捆绑sockfd 描述符*/if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) {fprintf(stderr,"Bind error:%s\n\a",strerror(errno));exit(1);}printf("服务器监听端口%d...\n",PORT);/* 监听sockfd 描述符*/if(listen(sockfd,LISTENQ)==-1){fprintf(stderr,"Listen error:%s\n\a",strerror(errno));exit(1);}thr_id = pthread_create(&p_thread, NULL, recvandsend, NULL);printf("NAME:Li Junnan No:8000612030 Class:Ji ruan121\n");printf("Welcome to the chat room\n");while(1){/* 服务器阻塞,直到客户程序建立连接*/if(maxi>=20){printf("Over the max people\n");continue;}sin_size=sizeof(struct sockaddr_in);if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1){fprintf(stderr,"Accept error:%s\n\a",strerror(errno));exit(1);}/*fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));*/client[maxi++]=new_fd;printf("\nNew %d user come to the chat room\n",new_fd-3);}close(sockfd);exit(0);}四、个人小结4.1 个人小结本次设计中也存在很多问题,一开始的客户端和服务器不能连接成功,还有就是当已经有用户开始聊天之后,新进来的用户发送的信息不能在之前的客户端看到,经过多次修改和查阅资料完成设计。