为什么这样用select,筛选式使用FD_ISSET 不行?
来源:互联网 发布:算法工程师要求 编辑:程序博客网 时间:2024/05/17 23:49
#include <stdio.h>#include <sys/socket.h>#include <stdlib.h>#include <netinet/in.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <errno.h>#define N 64typedef struct sockaddr SA;int main(int argc,char *argv[]){int listenfd,connfd[16],i = 0,maxfd;int n;struct sockaddr_in myaddr,peeraddr,connaddr;socklen_t peerlen = sizeof(connaddr),connlen = peerlen; char buf[N];fd_set readfd,fdsetbak;bzero(connfd,sizeof(connfd));//if(argc < 3)//{//printf("Usage: %s <IP> <Port>\n",argv[0]);//exit(-1);//}if((listenfd = socket(PF_INET,SOCK_STREAM,0)) < 0){perror("socket error");exit(-1);}bzero(&myaddr, sizeof(myaddr));myaddr.sin_family = PF_INET;myaddr.sin_port = htons(atoi("9090"));myaddr.sin_addr.s_addr = inet_addr("192.168.0.103");//myaddr.sin_port = htons(atoi(argv[2]));//myaddr.sin_addr.s_addr = inet_addr(argv[1]);if(bind(listenfd, (SA *)&myaddr, sizeof(myaddr)) < 0){perror("fail to bind");exit(-1);}if(listen(listenfd, 16) < 0){perror("fail to listen");exit(-1);}FD_ZERO(&readfd);FD_SET(listenfd,&readfd);maxfd = listenfd;fdsetbak = readfd;while(1){readfd = fdsetbak;if(select(maxfd+1, &readfd, NULL,NULL,NULL) < 0){perror("fail to select");exit(-3);}if(FD_ISSET(listenfd,&readfd)){i = 0;while(connfd[i]){i++;if(i>=16) break;// chao chu 16;}if((connfd[i] =accept(listenfd,(SA *)&peeraddr,&peerlen)) < 0){perror("fail to accept");i = 0;exit(-2);}FD_SET(connfd[i],&readfd);fdsetbak = readfd;maxfd = maxfd>connfd[i] ? maxfd:connfd[i];getsockname(connfd[i],(SA *)&connaddr,&connlen);printf("new connect from [%s:%d]to[%s:%d]\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port),inet_ntoa(connaddr.sin_addr),ntohs(connaddr.sin_port));}else{for(i = 0;i<16;i++){if(connfd[i]){if(FD_ISSET(connfd[i],&readfd)){if((n = recv(connfd[i],buf,N,0)) <=0){getpeername(connfd[i],(SA *)&peeraddr,&peerlen);printf("[%s:%d] closed\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port));FD_CLR(connfd[i],&fdsetbak );readfd = fdsetbak; close(connfd[i]);connfd[i] = 0;}else{printf("send to %d\n",connfd[i]);send(connfd[i],buf,n,0);}}}}}}return 0;}
筛选式的使用FD_ISSET不行吗?
非要
for(i=0;i<maxfd+1;i++)
{
FD_ISSET();
{
}
}
才行吗?
- 为什么这样用select,筛选式使用FD_ISSET 不行?
- 在C++中enum这样用为什么不行呢?
- 为什么这样写还不行呢
- FD_SET,FD_ISSET,FD_ZERO,select
- Socket select FD_ISSET
- FD_SET,FD_ISSET,FD_ZERO,select
- SELECT FD_ZERO FD_ISSET
- SELECT FD_ZERO FD_ISSET
- SELECT FD_ZERO FD_ISSET
- 这样下去不行
- 哎呀,这样不行呀
- select ,FD_ZERO,FD_SET,FD_CLR,FD_ISSET
- select()/FD_ZERO()/FD_SET()/FD_CLR()/FD_ISSET()
- select(), FD_SET(), FD_CLR(), FD_ISSET(), FD_ZERO()
- select()/FD_ZERO()/FD_SET()/FD_CLR()/FD_ISSET() .
- COM进程外服务器实现 QueryInterface时,这样的代码为什么不行?
- 中国大学生为什么就是不行?
- 为什么Scrum不行?
- 电容屏原理
- proc源码解析(七)--查找目录项
- Node.js的入门配置开发《视频》
- 移植最简单linux-3.5.4内核到s3c6410
- 分享一个基于winForm后台单线程推送多线程并行处理业务的小程序框架
- 为什么这样用select,筛选式使用FD_ISSET 不行?
- 【Windows8开发】异步编程进阶篇之 create_async, create_task, make_task区别与联系
- 九一八,勿忘国耻,抵制苍井空,还我钓鱼岛。
- Android4.0.3/Android4.2.2 添加 Ethernet
- mybatis There is no getter for property named 'xx' in 'class java.lang.String
- MyBATIS(即iBATIS)问题集
- hdu 3397 线段树前后缀blahblah Sequence operation
- 如何在WinRT中调用类似STL的Vector和Map
- ubuntu下配置dns