- 论坛徽章:
- 0
|
我最近在看unix网络编程一书,上面有个客户端服务器程序,其中有一个服务器程序是用poll函数实现的,我的客户端程序已经连接,poll的结果还是0,listen端口好像没有连上,这是什么原因啊? (客户端程序已经经过验证)
还有书上说POLLRDNORM常量引用头文件<stropts.h>;就行,但是,我引用了
还是不可以,而且在源代码里面也找不到这个头文件,这是怎么回事啊?
- include <stdio.h>;
- #include <string.h>;
- #include <sys/types.h>;
- #include <sys/socket.h>;
- #include <netinet/in.h>;
- #include <poll.h>;
- #include <errno.h>;
- #include "myhead.h"
- #define OPEN_MAX 256
- #define INFTIM 1000
- int main(int argc, char **argv){
- int listenfd,connfd,i,maxi,sockfd;
- int nready;
- size_t n;
- char line[MAXLINE];
- socklen_t clilen;
- struct pollfd client[OPEN_MAX];
- struct sockaddr_in servaddr,cliaddr;
- if((listenfd = socket(AF_INET,SOCK_STREAM,0))<0){
- perror("socket");
- return;
- };
- bzero(&servaddr,sizeof(struct sockaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port =htons(9777);
- if(bind(listenfd,(struct sockaddr *)&servaddr,
- sizeof(struct sockaddr_in))<0){
- perror("bind");
- return;
- };
- if(listen(listenfd,8)<0){
- perror("listen");
- return;
- };
- printf("Wait for connection!\n");
- client[0].fd = listenfd;
- client[0].events = POLLIN;
- for(i = 1; i < OPEN_MAX; i++)
- client[0].fd = -1;
- maxi = 0;
- for(;;){
- if ((nready = poll(client,maxi+1,256))<0){
- perror("poll");
- return;
- };
- printf("nready %d\n",nready);
- if (client[0].revents&POLLIN){
- clilen = sizeof(cliaddr);
- if ((connfd = accept(listenfd,
- (struct sockaddr *)&cliaddr,&clilen))<0){
- perror("accept");
- return;
- };
- printf("accept one!\n");
- for(i = 1;i<OPEN_MAX; i++)
- if(client[i].fd<0){
- client[i].fd = connfd;
- break;
- }
- if(i == OPEN_MAX){
- printf("too many clients!\n");
- return;
- }
- client[i].events = POLLIN;
- if(i >; maxi)
- maxi = i;
- if(--nready <= 0)
- continue;
-
- }
- for( i = 0; i<= maxi; i++){
- if ((sockfd = client[i].fd)<0)
- continue;
- if(client[i].revents & (POLLIN|POLLERR)){
- if((n = readline(sockfd,line,MAXLINE))<0){
- if(errno == ECONNRESET){
- close(sockfd);
- client[i].fd = -1;
- }else{
- printf("readline error\n");
- return;
- }
- }else if (n == 0){
- close(sockfd);
- client[i].fd = -1;
- }else
- write(sockfd,line,n);
- if(--nready<=0)
- break;
- }
- }
- }
- }
复制代码 |
|