- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
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) 服务器所监听的端口。
listen(socket, MAX_CLIENT);
// 地址绑定后,服务器进入监听状态。
// MAX_CLIENT是可以同时建立连接的客户总数。
服务器进入监听状态后,等待客户建立连接。若客户需要连接,也需要先进行网络部分的初始化工作:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 与服务器端相同。
connect(sockfd, (struct sockaddr *)
serv_addr, sizeof(serv_addr))
// 客户使用connect建立一个连接。
// serv_addr中的变量分别设置为:
// sin_family = AF_INET 协议族同socket
// sin_addr.s_addr = inet_addr(SERV_HOST_ADDR)
// 地址为server所在的计算机地址,本程序中为127.0.0.1
// sin_port = htons(SERV_TCP_PORT)端口为服务器监听的端口。
当客户建立新连接的时候,服务器使用accept来接收该连接:
accept(sockfd, (struct sockaddr *)cli_addr, cli_len);
// 在函数返回时,cli_addr中保留的是该连接对方的信息
// 包括IP地址和对方使用的端口。
// accept返回一个新的文件描述符。
在服务器进入监听状态以后,使用select方法实现,该方法中的所有描述符都是阻塞的。使用select判断一组文件描述符中时候有一个可读(写),如果没有就阻塞。直到有一个的时候被唤醒。
客户端实现如下:
由于要处理两个文件描述符,因此需要判断是否有可读写的文件描述符需要加入两项:
FD_ZERO(sockset);
// 将sockset清空。
FD_SET(sockfd, sockset);
// 把sockfd加入到sockset集合中。
FD_SET(0, sockset);
// 把标准输入(0)加入到sockset集合中。
然后客户处理如下:
while(不想退出) {
select(sockfd+1, sockset, NULL, NULL, NULL);
// 此时该函数使进程阻塞,直到标准输入或者sockfd中有一个可读为止
// 第一个参数是0和sockfd中的最大值加1
// 第二个参数是读集合,也就是sockset
您可能关注的文档
最近下载
- 注册香港公司的香港投资环境介绍。.doc VIP
- 9《天上有颗南仁东星》课件 统编版语文八年级上册.pptx VIP
- 第8讲 二《德不可空谈》课件 学生读本高年级 (1).pptx
- 脚手架、满堂架钢管、扣件用量的计算.xls VIP
- 1-3-4氧化还原反应配平教学设计2023-2024学年高一上学期化学人教版(2019)必修第一册.docx VIP
- 石油化工金属管道布置设计规范.docx VIP
- 中国IBD蓝皮书 -中国炎症性肠病医患认知 暨生存质量报告 溃疡性结肠炎部分.docx
- AB变频器PowerFlex 700 说明书.pdf VIP
- 压覆影响区范围的确定、压覆矿产资源调查报告编写提纲、评估报告编写提纲.docx VIP
- 公安辅警综合基础知识题库汇总及答案解析.docx VIP
文档评论(0)