




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
什么是异步通讯?就是通讯任意一方可以任意发送消息,有消息来到时会收到系统提示去接收消息。这里要用到select函数。使用步骤如下:1、设置一个集合变量,用来存放所有要判断的句柄(file descriptors:即我们建立的每个socket、用open打开的每个文件等)2、把需要判断的句柄加入到集合里3、设置判断时间4、开始等待,即select5、如果在设定的时间内有任何句柄状态变化了就马上返回,并把句柄设置到集合里服务器端源代码如下:#include #include #include #include #include #include #include #include #include #include #include #include #define MAXBUF 1024/*关于本文档*filename: async-server.c*purpose: 演示网络异步通讯,这是服务器端程序*wrote by: zhoulifa() 周立发()Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言*date time:2007-01-25 21:22*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途* 但请遵循GPL*Thanks to: G*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!*/int main(int argc, char *argv) int sockfd, new_fd; socklen_t len; struct sockaddr_in my_addr, their_addr; unsigned int myport, lisnum; char bufMAXBUF + 1; fd_set rfds; struct timeval tv; int retval, maxfd = -1; if (argv1) myport = atoi(argv1); else myport = 7838; if (argv2) lisnum = atoi(argv2); else lisnum = 2; if (sockfd = socket(PF_INET, SOCK_STREAM, 0) = -1) perror(socket); exit(1); bzero(&my_addr, sizeof(my_addr); my_addr.sin_family = PF_INET; my_addr.sin_port = htons(myport); if (argv3) my_addr.sin_addr.s_addr = inet_addr(argv3); else my_addr.sin_addr.s_addr = INADDR_ANY; if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr) = -1) perror(bind); exit(1); if (listen(sockfd, lisnum) = -1) perror(listen); exit(1); while (1) printf (n-等待新的连接到来开始新一轮聊天n); len = sizeof(struct sockaddr); if (new_fd = accept(sockfd, (struct sockaddr *) &their_addr, &len) = -1) perror(accept); exit(errno); else printf(server: got connection from %s, port %d, socket %dn, inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port), new_fd); /* 开始处理每个新连接上的数据收发 */ printf (n准备就绪,可以开始聊天了直接输入消息回车即可发信息给对方n); while (1) /* 把集合清空 */ FD_ZERO(&rfds); /* 把标准输入句柄0加入到集合中 */ FD_SET(0, &rfds); maxfd = 0; /* 把当前连接句柄new_fd加入到集合中 */ FD_SET(new_fd, &rfds); if (new_fd maxfd) maxfd = new_fd; /* 设置最大等待时间 */ tv.tv_sec = 1; tv.tv_usec = 0; /* 开始等待 */ retval = select(maxfd + 1, &rfds, NULL, NULL, &tv); if (retval = -1) printf(将退出,select出错! %s, strerror(errno); break; else if (retval = 0) /* printf (没有任何消息到来,用户也没有按键,继续等待n); */ continue; else if (FD_ISSET(0, &rfds) /* 用户按键了,则读取用户输入的内容发送出去 */ bzero(buf, MAXBUF + 1); fgets(buf, MAXBUF, stdin); if (!strncasecmp(buf, quit, 4) printf(自己请求终止聊天!n); break; len = send(new_fd, buf, strlen(buf) - 1, 0); if (len 0) printf (消息:%st发送成功,共发送了%d个字节!n, buf, len); else printf (消息%s发送失败!错误代码是%d,错误信息是%sn, buf, errno, strerror(errno); break; if (FD_ISSET(new_fd, &rfds) /* 当前连接的socket上有消息到来则接收对方发过来的消息并显示 */ bzero(buf, MAXBUF + 1); /* 接收客户端的消息 */ len = recv(new_fd, buf, MAXBUF, 0); if (len 0) printf (接收消息成功:%s,共%d个字节的数据n, buf, len); else if (len 退出); fflush(stdout); bzero(buf, MAXBUF + 1); fgets(buf, MAXBUF, stdin); if (!strncasecmp(buf, no, 2) printf(终止聊天!n); break; close(sockfd); return 0; 客户端源代码如下:#include #include #include #include #include #include #include #include #include #include #include #define MAXBUF 1024/*关于本文档*/ *filename: ssync-client.c*purpose: 演示网络异步通讯,这是客户端程序*wrote by: zhoulifa() 周立发()Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言*date time:2007-01-25 21:32*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途* 但请遵循GPL*Thanks to: G*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!*/int main(int argc, char *argv) int sockfd, len; struct sockaddr_in dest; char bufferMAXBUF + 1; fd_set rfds; struct timeval tv; int retval, maxfd = -1; if (argc != 3) printf (参数格式错误!正确用法如下:ntt%s IP地址 端口nt比如:t%s 80n此程序用来从某个 IP 地址的服务器某个端口接收最多 MAXBUF 个字节的消息, argv0, argv0); exit(0); /* 创建一个 socket 用于 tcp 通信 */ if (sockfd = socket(AF_INET, SOCK_STREAM, 0) maxfd) maxfd = sockfd; /* 设置最大等待时间 */ tv.tv_sec = 1; tv.tv_usec = 0; /* 开始等待 */ retval = select(maxfd + 1, &rfds, NULL, NULL, &tv); if (retval = -1) printf(将退出,select出错! %s, strerror(errno); break; else if (retval = 0) /* printf (没有任何消息到来,用户也没有按键,继续等待n); */ continue; else if (FD_ISSET(sockfd, &rfds) /* 连接的socket上有消息到来则接收对方发过来的消息并显示 */ bzero(buffer, MAXBUF + 1); /* 接收对方发过来的消息,最多接收 MAXBUF 个字节 */ len = recv(sockfd, buffer, MAXBUF, 0); if (len 0) printf (接收消息成功:%s,共%d个字节的数据n, buffer, len); else if (len 0) printf (消息接收失败!错误代码是%d,错误信息是%sn, errno, strerror(errno); else printf(对方退出了,聊天终止!n); break; if (FD_ISSET(0, &rfds) /* 用户按键了,则读取用户输入的内容发送出去 */ bzero(buffer, MAXBUF + 1); fgets(buffer, MAXBUF, stdin); if (!strncasecmp(buffer, quit, 4) printf(自己请求终止聊天!n); break; /*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国家事业单位招聘2025中国农业科学院植物保护研究所农药环境风险评估及控制创新任务科研助理笔试历年参考题库附带答案详解
- 台州市2025年浙江天台县委政法委下属事业单位选聘工作人员笔试历年参考题库附带答案详解
- 仓山区2025福建福州市仓山区委宣传部编外人员招聘1人笔试历年参考题库附带答案详解
- 2025陕西建工新能源有限公司校园招聘(27人)笔试参考题库附带答案详解
- 2025辽宁沈阳地铁集团有限公司所属公司招聘11人笔试参考题库附带答案详解
- 2025福建省船舶工业集团有限公司招聘5人笔试参考题库附带答案详解
- 2025年芜湖城市园林集团股份有限公司招聘30人笔试参考题库附带答案详解
- 2025年湖南长沙振望投资发展有限公司招聘8人笔试参考题库附带答案详解
- 2025年榆林市公共交通总公司招聘(57人)笔试参考题库附带答案详解
- 2025年山东电工电气集团有限公司社会招聘(44人)笔试参考题库附带答案详解
- 世界避孕日培训
- 政务摄影培训课件模板
- 职业健康卫生培训课件
- 快递行业包裹分拣操作流程模拟题
- 辅助生殖妊娠营养干预
- 模块六 点的投影(课件)-中职高考《机械制图》一轮复习(高教版第5版)
- 健康素养促进项目课件
- 2024湘美版小学书法三年级上册教学设计(附目录)
- 固定摊位合租协议书
- 2025年国企人力资源管理岗招聘考试真题卷(含岗位说明书)
- 中国药典2025年版1~4部目录
评论
0/150
提交评论