信息安全实践并发服务起(3).docx_第1页
信息安全实践并发服务起(3).docx_第2页
信息安全实践并发服务起(3).docx_第3页
信息安全实践并发服务起(3).docx_第4页
信息安全实践并发服务起(3).docx_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

四 川 大 学 计 算 机 学 院、软 件 学 院实 验 报 告 学号:_1043111034_ 姓名:陈枝 专业:软件工程 班级:3 第12 周 课程名称 操作系统 实验课时7实验项目多路I/O模型实验时间2实验目的 并发服务器III多路I/O模型实验环境 Linux虚拟机 实验内容(算法、程序、步骤和方法) 实验要求:结合教师给的两个参考程序(基于select的远程并发服务器和基于select 的聊天程序),利用select函数实现在Linux环境下实现一个聊天室程序,要求: 1. 用户默认处于广播模式,一个客户在其客户端发送的消息,其它客户端用户全部可以收到; 2. 程序支持下列命令 /help:显示帮助信息(思考:信息是放在客户端还是服务器端); /quit:用户退出聊天室,同时将退出信息广播给其他用户; /who:显示在线用户; /send 用户名 消息:向指定用户发送点到点消息 服务器:#include #include #include #include #include #include #include /* port were listening on */#define SERVERPORT 1573/*maximum cnnnect number*/#define BACKLOG 10/*maximum data buffer*/#define BUFSIZE 2048struct client_infoint client_id;struct sockaddr_in client_address;int first;char name20;int ishide;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_bufBUFSIZE;char send_bufBUFSIZE;/*number of client data*/int nbytes;/*for set socket option*/int opt;opt = SO_REUSEADDR; /*lenth of address*/int addr_len;/*for accept() to use*/int size;size = sizeof(struct sockaddr);/*temple varient*/int tmp_i, tmp_j,j;struct client_info clientinfoBACKLOG;/*clear the master and temple file descriptor*/FD_ZERO(&master_fds);FD_ZERO(&read_fds);memset(&data_buf, 0, BUFSIZE);memset(&send_buf, 0, BUFSIZE);/*create socket*/if (-1 = (sockfd = socket(AF_INET, SOCK_STREAM, 0)perror(create socket() error:);exit(1);/*set the socket*/ if (-1 = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt) perror(setsockopt() error:);exit(1); /*bind first config the socket then binding*/memset(&server_addr, 0, size);server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVERPORT);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);bzero(&(server_addr.sin_zero), 8);if (-1 = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)perror(bind() socket error:);exit(1);/*listen */if (-1 = listen(sockfd, BACKLOG)perror(listen() error:);exit(1);/*add sockfd to master set*/FD_SET(sockfd, &master_fds);/*keep track the max file descriptor*/max_fd = sockfd;printf(server is ok!n);/*loop*/for (j = 0; j BACKLOG; j+) clientinfoj.client_id=-1;clientinfoj.ishide=0;/ end forwhile (1)read_fds = master_fds;if (-1= select(max_fd + 1, &read_fds, NULL, NULL, NULL)perror(select() error!n);exit(1);/*looking for data to read*/for (tmp_i = sockfd; tmp_i max_fd)max_fd = newfd;strcpy(send_buf,your name is: );/sprintf(data_buf,%d,newfd);/strcat(send_buf,data_buf);write(newfd,send_buf,sizeof(send_buf);send_buf0=0;data_buf0=0;/printf(Get the new connect from %sn, inet_ntoa(client_addr.sin_addr);else/*get data from the client*/nbytes = read(tmp_i, data_buf, sizeof(data_buf);if (0 nbytes)perror(recv() error:);exit(1);else if(clientinfotmp_i.first=1)strncpy(clientinfotmp_,data_buf,20);clientinfotmp_i.first=0;else if(nbytes = 0 | (0 = strcmp(data_buf, exit)printf(client: %s exit!n,clientinfotmp_);FD_CLR(tmp_i, &master_fds);close(tmp_i);strcat(send_buf, clientinfotmp_);strcat(send_buf, was exit!);clientinfotmp_i.client_id=-1;for (tmp_j = sockfd + 1; tmp_j = max_fd; tmp_j+)if (FD_ISSET(tmp_j, &master_fds)if (-1 = write(tmp_j, send_buf, nbytes)perror(send data error:);/ end for else if(0 = strcmp(data_buf, /hide) clientinfotmp_i.ishide = 1;else if(0 = strcmp(data_buf, /unhide)clientinfotmp_i.ishide = 0;else if(0 = strcmp(data_buf, /who)printf(recv /who n);strcat(send_buf,logged user: n);for (j = 0; j BACKLOG; j+)if(clientinfoj.client_id!=-1 & clientinfoj.ishide = 0 )/sprintf(data_buf,%s,);strcat(send_buf,);strcat(send_buf,n);write(tmp_i, send_buf, sizeof(send_buf);else if(0 = strncmp(data_buf, /send,5)char username20;int to;sscanf(&data_buf6,%s,username);printf(username is %sn,username);to=getfdbyname(username,clientinfo,BACKLOG);if(to=-1)printf(send name is: %s,username);sprintf(send_buf,there is no this user with this name%sn,username);write(tmp_i, send_buf, sizeof(send_buf);elsesprintf(send_buf,message from %s: %s,clientinfotmp_,&data_buf7+strlen(username);/printf(to is %dn,to);/strcat(send_buf,&data_buf7);printf(send_buf is:%sn,send_buf);write(to, send_buf, strlen(send_buf);elseprintf(get data:%s from the client :, data_buf);/printf(%sn, inet_ntoa(clientinfotmp_i.client_address.sin_addr);strcat(send_buf,clientinfotmp_);strcat(send_buf, said: );strcat(send_buf, data_buf);for (tmp_j = sockfd + 1; tmp_j = max_fd; tmp_j+)if (FD_ISSET(tmp_j, &master_fds)if (-1 = write(tmp_j, send_buf, nbytes)perror(send data error:);/ end for/end else/end else/end if/end for memset(&data_buf, 0, BUFSIZE);memset(&send_buf, 0, BUFSIZE);/FD_ZERO(&master_fds);/FD_SET(sockfd, &master_fds);/end whilereturn 0;int getfdbyname(char* username,struct client_info* clients,int size)int i;for(i=0;isize;i+)if(clientsi.client_id!=-1)if(strcmp(,username)=0)return clientsi.client_id;return -1;客户端:#include #include #include #include #include #include #include #include #define CLIENTPORT 1573#define BUFSIZE 2048int main(int argc, char *argv)int sockfd;fd_set sockset;struct sockaddr_in serveraddr;struct sockaddr_in clientaddr;int recvbytes;char recv_bufBUFSIZE;char send_bufBUFSIZE;int data_len;if (2 argc)printf(Please input the server ip!n);exit(1);if (-1 = (sockfd = socket(AF_INET, SOCK_STREAM, 0 )printf(create the socket error!n);perror(create errors are :);exit(1);memset(&serveraddr, 0, sizeof(struct sockaddr_in);serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(argv1);serveraddr.sin_port = htons(CLIENTPORT);if (-1= connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr)perror(connect error:);exit(1);fprintf(stdout, client ok!n);fflush(stdout); while (1) FD_ZERO(&sockset); FD_SET(sockfd, &sockset); FD_SET(0, &sockset); memset(recv_buf, 0, sizeof(recv_buf);memset(send_buf, 0, sizeof(send_buf);select( sockfd+1, &sockset, NULL, NULL, NULL); if (FD_ISSET( sockfd, &sockset) if (-1 = (recvbytes =read(sockfd, recv_buf, sizeof(recv_buf)perror(read data error:);close(sockfd);exit(1);recv_bufrecvbytes = 0;printf(%sn, recv_buf);fflush(stdout);if ( FD_ISSET( 0, &sockset) fgets(send_buf, sizeof(send_buf), stdin);data_len = strlen(send_buf);send_bufdata_len - 1 = 0;if (send_buf0=/)if (0 = strcmp(send_buf, /quit)printf(quiting from

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论