- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
- 五年级数学最大公因数,最小公倍数练习题(含提高).doc
- 五年级第一学期寒假计算练习.doc
- 五年级约分通分练习题.doc
- 五年级语文上册综合实践活动:有趣的汉字教案.doc
- 五星级酒店暖通专业设计说明.doc
- 五种蓝黑墨水的比较.doc
- 五邑大学网络通识课侵权法第三章.doc
- 井下巷道管线吊挂标准.doc
- 井塌预防处理措施.doc
- 亚洲及欧洲知识点总结.doc
- 2025年天津市冷链物流基地配套道路建设可行性研究报告.docx
- 2025年天津市母婴护理会所专业化服务升级路径可行性研究报告.docx
- 2025年成都市私立医院医美抗衰中心创建可行性研究报告.docx
- 2025年成都市淡化海水在城市道路清洗领域的应用可行性研究报告.docx
- 2025年上海市环卫厨余垃圾生物处理技术应用可行性研究报告.docx
- 2025年天津市花西子针对户外运动妆容的可行性.docx
- 2025年上海市生物发电于秸秆炭化还田协同发电的可行性研究.docx
- 2025年天津市物造纸在可降解农用地膜领域的应用可行性研究报告.docx
- 2025年天津市无人值守充电站智能运维可行性研究报告.docx
- 2025年天津市竹荪种植连作障碍防治技术可行性研究报告.docx
文档评论(0)