[linux C]使用select进行非阻塞socket通信
2015-02-03 14:20
232 查看
代码片:
如果有多个待监听到sockfd,就将其通过
添加到描述符集合中;然后通过
判断哪个描述符可以读取。
注意:
好像没有这段代码,程序执行之后不能成功监听到发送来的数据。暂时也不知道为什么。
fd_set save_fds; int sockfd; struct sockaddr_in serv_addr; //my address struct sockaddr_in client_addr; if((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))== -1) { perror("socekt error"); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SERVERPORT); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); bzero(&(serv_addr.sin_zero),8); socklen_t sin_size = sizeof(struct sockaddr_in); assert(bind(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr_in)) == 0); FD_ZERO(&save_fds); FD_SET(sockfd,&save_fds); struct timeval timeout= {0,0}; //非阻塞就置0 while(1) { <span style="color:#FF0000;"> fd_set read_fds = save_fds;</span> int result = select(sockfd + 1, &read_fds, 0, 0, &timeout); if(result >0 ) { if(FD_ISSET(sockfd,&read_fds)) { bzero(revbuf,BUFSIZE); int ret = recvfrom(sockfd, revbuf, BUFSIZE, 0, (struct sockaddr*) &client_addr, &sin_size); if (ret > 0) { printf("receive buf is %s",revbuf); } } } sleep(1); //..... }
如果有多个待监听到sockfd,就将其通过
FD_SET(sockfd,&save_fds);
添加到描述符集合中;然后通过
FD_ISSET(sockfd,&read_fds)
判断哪个描述符可以读取。
注意:
<span style="color:#FF0000;">fd_set read_fds = save_fds;</span>
好像没有这段代码,程序执行之后不能成功监听到发送来的数据。暂时也不知道为什么。
相关文章推荐
- linux下使用管道pipe和select创建阻塞
- 使用ganyssh包进行linux连接时读回显时readLine发生io阻塞解决方法
- linux转到windows 的javaer在eclipse上面使用CDT进行Win32SDK编程
- 使用非阻塞方式的Socket通信
- 在Linux下使用nc命令进行文件传输
- 如何使用eclipse进行嵌入式Linux的开发
- 如何使用eclipse进行嵌入式Linux的开发
- 美国防部将使用 Linux 计算机集群进行战斗模拟
- 在Linux下使用nc命令进行文件传输收藏
- Linux下编程工具的使用(6) - VIM编辑器系列(1) - 进行有效编辑的七种习惯(vim)
- 使用Delphi的Socket组件进行阻塞方式通信的零碎
- 使用SecureCRT对Linux vim进行颜色设置
- Linux下进程的创建及其使用管道进行进程之间的通讯[00原创]
- 一步一步教你使用.net进行Socket通信
- Linux系统下使用Syslog进行远程登录
- 使用SecureCRT对Linux vim进行颜色设置【可用的.vimrc文件内容】
- 使用Grub进行Linux的硬盘安装与修复
- 使用tar或者afio对linux系统进行备份
- 使用Gnu gprof进行Linux平台下的程序分析
- 使用gparted和acronis进行Linux分区和NTFS分区无损调整(跟我的做法一样)