信息安全实践第九次作业 并发服务器III——多路IO模型.docVIP

信息安全实践第九次作业 并发服务器III——多路IO模型.doc

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
四 川 大 学 计 算 机 学 院、软 件 学 院 实 验 报 告 学号:姓名:专业:__软件工程__ 班级: 第 9 周 课程名称 \o 点击进入该课程 信息安全产品开发实践? 实验课时 4 实验项目 并发服务器III——多路I/O模型 实验时间 2013.11.9 实验目的 利用select函数实现在Linux环境下实现一个聊天室程序? 实验环境 ? 虚拟机 Ubuntu-VMware Workstation? 实验内容(算法、程序、步骤和方法) 这次的实验还是分服务器和客户端,客户端的代码基本用demo中的就行了,只需把通过输入’exit’退出改成通过输入’/quit’退出就行了。 服务器有关多路I/O的核心代码已经在demo中完成了,理论上只需要往demo程序中添加聊天室的各个功能就好了。 但是个人刚开始对demo服务器代码还是有疑问,所以把demo程序的一部分代码修改过,主要改动如下: 在扫描所有文件描述符的for循环中,demo程序是从sockfd(广播时+1)服务器套接字(文件描述符)开始往后扫描的,我把它改成了从0(或3)开始扫描(当然,这样做的话需要注意在广播的时候要跳过sockfd)。 在demo程序中接收新用户是clientinfo[newfd].client_id = newfd,而clientinfo的长度为BACKLOG 10,先不说文件描述符0、1、2分别代表着标准输入、标准输出、标准错误输出,实际能用的只有7个,而且也不能保证新建的套接字(文件描述符)数值不超过9,所以我把demo改成当接收新用户时用一个for循环在clientinfo中寻找空闲结点(空闲结点里面的client_id为-1),结点下标和文件描述符本身并没关系(当然也可以把BACKLOG定义为FD_SETSIZE)。 不过有关这两点改动在后来的试验中发现时毫无意义的,因为文件描述符是从3开始往上递增建立,就是说sockfd作为第一个建立的文件描述符数值为3(所有套接字中最小),后面建立的套接字会按加1递增。 接下来的就是一些细节问题了,如: 接收username的时候要注意把最后的换行符’\n’改成’\0’。 使用strcmp判断对方的命令的时候不能在第二个参数中直接放一个字符串常量(如strcmp(data_buf, /help)),要另外声明一个字符指针变量。 ... 以下是代码: /* linux-socket-select-异步聊天室 talk_server.c writed by hanzhongqiu 13/04/2009 Using select() for I/O multiplexing */ #include stdio.h #include stdlib.h #include string.h #include sys/socket.h #include netdb.h #include sys/time.h #include sys/types.h /* port were listening on */ #define SERVERPORT 1573 /*maximum cnnnect number*/ #define BACKLOG 10 /*maximum data buffer*/ #define BUFSIZE 2048 struct client_info { int client_id; struct sockaddr_in client_address; char usrname[256];//客户的名字 int first;//用于只是用户是否刚刚登陆 }; int main() { /*master file descriptor list*/ fd_set master_fds; /*temple file descriptor list for select()*/ fd_set read_fds; /*server address*/ struct sockaddr_in server_addr; /*client address*/ struct sockaddr_in client_addr; /*maximum file descriptor number*/ int max_fd; /*listening socket file descriptor*/ int sockfd; /*newly accept()ed socket file descreptor*/ int newfd; /*buffer for saving client data*/ char data_buf[BUFSI

文档评论(0)

kongbaipan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档