免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3538 | 回复: 4
打印 上一主题 下一主题

请教unix网络编程中的poll程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-25 16:24 |只看该作者 |倒序浏览
我最近在看unix网络编程一书,上面有个客户端服务器程序,其中有一个服务器程序是用poll函数实现的,我的客户端程序已经连接,poll的结果还是0,listen端口好像没有连上,这是什么原因啊? (客户端程序已经经过验证)

还有书上说POLLRDNORM常量引用头文件<stropts.h>;就行,但是,我引用了
还是不可以,而且在源代码里面也找不到这个头文件,这是怎么回事啊?


  1. include <stdio.h>;
  2. #include <string.h>;
  3. #include <sys/types.h>;
  4. #include <sys/socket.h>;
  5. #include <netinet/in.h>;
  6. #include <poll.h>;
  7. #include <errno.h>;
  8. #include "myhead.h"
  9. #define OPEN_MAX 256
  10. #define INFTIM   1000

  11. int main(int argc, char **argv){
  12.         int listenfd,connfd,i,maxi,sockfd;
  13.         int nready;
  14.         size_t n;
  15.         char line[MAXLINE];
  16.         socklen_t clilen;
  17.         struct pollfd client[OPEN_MAX];
  18.           struct sockaddr_in servaddr,cliaddr;
  19.         if((listenfd = socket(AF_INET,SOCK_STREAM,0))<0){
  20.                 perror("socket");
  21.                 return;
  22.         };
  23.         bzero(&servaddr,sizeof(struct sockaddr));
  24.         servaddr.sin_family = AF_INET;
  25.         servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  26.         servaddr.sin_port =htons(9777);
  27.         if(bind(listenfd,(struct sockaddr *)&servaddr,
  28.                 sizeof(struct sockaddr_in))<0){
  29.                 perror("bind");
  30.                 return;       
  31.         };
  32.         if(listen(listenfd,8)<0){
  33.                 perror("listen");
  34.                 return;
  35.         };
  36.         printf("Wait for connection!\n");
  37.               client[0].fd = listenfd;
  38.         client[0].events = POLLIN;
  39.         for(i = 1; i < OPEN_MAX; i++)
  40.                 client[0].fd = -1;
  41.         maxi = 0;
  42.         for(;;){
  43.                 if ((nready = poll(client,maxi+1,256))<0){
  44.                         perror("poll");
  45.                         return;
  46.                 };
  47.                     printf("nready %d\n",nready);
  48.                 if (client[0].revents&POLLIN){
  49.                         clilen = sizeof(cliaddr);
  50.                         if ((connfd = accept(listenfd,
  51.                                 (struct sockaddr *)&cliaddr,&clilen))<0){
  52.                                 perror("accept");
  53.                                 return;
  54.                         };
  55.                         printf("accept one!\n");
  56.                         for(i = 1;i<OPEN_MAX; i++)
  57.                                 if(client[i].fd<0){
  58.                                         client[i].fd = connfd;
  59.                                         break;
  60.                                 }
  61.                         if(i == OPEN_MAX){
  62.                                 printf("too many clients!\n");
  63.                                 return;
  64.                         }
  65.                         client[i].events = POLLIN;
  66.                         if(i >; maxi)
  67.                                 maxi = i;
  68.                         if(--nready <= 0)
  69.                                 continue;
  70.        
  71.                 }
  72.                 for( i = 0; i<= maxi; i++){

  73.                         if ((sockfd = client[i].fd)<0)
  74.                                  continue;
  75.                         if(client[i].revents & (POLLIN|POLLERR)){
  76.                                 if((n = readline(sockfd,line,MAXLINE))<0){
  77.                                         if(errno == ECONNRESET){
  78.                                                 close(sockfd);
  79.                                                 client[i].fd = -1;
  80.                                         }else{
  81.                                                 printf("readline error\n");
  82.                                                 return;
  83.                                         }
  84.                                 }else if (n == 0){
  85.                                         close(sockfd);
  86.                                         client[i].fd = -1;
  87.                                 }else
  88.                                         write(sockfd,line,n);
  89.                                 if(--nready<=0)
  90.                                         break;
  91.                         }
  92.                 }
  93.         }
  94. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2005-10-25 17:07 |只看该作者

请教unix网络编程中的poll程序

没用过,POLL只用过SELECT
你这样编译不过吧!
readline(sockfd,line,MAXLINE)
MAXLINE和readline都没有定义

论坛徽章:
0
3 [报告]
发表于 2005-10-25 17:08 |只看该作者

请教unix网络编程中的poll程序

poll基本上很少用了,

论坛徽章:
0
4 [报告]
发表于 2005-10-25 19:16 |只看该作者

请教unix网络编程中的poll程序

原帖由 "xujie0724" 发表:
没用过,POLL只用过SELECT
你这样编译不过吧!
readline(sockfd,line,MAXLINE)
MAXLINE和readline都没有定义

这两个都是UNP里写好的,LZ直接用了

论坛徽章:
0
5 [报告]
发表于 2005-10-26 09:45 |只看该作者

请教unix网络编程中的poll程序

确实是已经写好的,我限于篇幅的原因只把主程序写在了这里,实在抱歉。

有没有人用过Poll,是不是不好用啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP