poll函式在處理併發時, 無fd_setsize限制
//伺服器端
#include #include #include #include #include #include //使用signal函式
#include //使用wait函式
#include #include #include #include #include #define err_exit(m) \
do \
while(0)
//讀確定大小的包
//ssize_t有符號數,size_t為無符號數
ssize_t readn(int fd, void *buf, size_t count)
return -1;//否則出錯
} else if(nread==0)//表示對方關閉傳送
bufp+=nread;//進行指標偏移
nleft -= nread;
} return count;
}ssize_t writen(int fd, const void *buf, size_t count)
return -1;//否則出錯
} else if(nwritten==0)
bufp+=nwritten;//進行指標偏移
nleft -= nwritten;
} return count;
}ssize_t recv_peek(int sockfd, void *buf,size_t len)
}ssize_t readline(int sockfd, void *buf, size_t maxline)
else if(ret=0)
nread=ret;
int i;//檢測有沒有『\n』字元,有則讀取
for(i=0; i0)
}int main(void)
else
close(conn);
} */
int i;
int maxi = 0;
struct pollfd client[2048];//假設乙個程序可以開啟最大的檔案描述符數為2048
for(i=0; i<2048; i++)
int nready;
client[0].fd = listenfd;
client[0].events = pollin;//讀可讀事件感興趣
while(1)
if(nready==0)
continue;
if(client[0].revents & pollin)//返回發生的事件與pollin相同
//if(fd_isset(listenfd, &rset))
}if(i==2048)
printf("ip=%s port=%d\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));
//fd_set(conn, &allset);
client[i].events = pollin;//新增事件
if(--nready<=0)
continue;
}//監聽套介面總為client[0]
//已連線套介面從1到maxi
for(i=1; i<=maxi; i++)
;int ret = readline(conn, recvbuf,1024);//先接受包頭
if(ret==-1)//讀取失敗則退出
err_exit("readline");
else if(ret==0)//客戶端關閉
fputs(recvbuf,stdout);//列印標準輸出
writen(conn,recvbuf, strlen(recvbuf));
if(--nready<=0)
break;}}
} return 0;
}#include #include #include #include #include #include #include #include #include #define err_exit(m) \
do \
while(0)
//讀確定大小的包
//ssize_t有符號數,size_t為無符號數
ssize_t readn(int fd, void *buf, size_t count)
return -1;//否則出錯
} else if(nread==0)//表示對方關閉傳送
bufp+=nread;//進行指標偏移
nleft -= nread;
} return count;
}ssize_t writen(int fd, const void *buf, size_t count)
return -1;//否則出錯
} else if(nwritten==0)
bufp+=nwritten;//進行指標偏移
nleft -= nwritten;
} return count;
}ssize_t recv_peek(int sockfd, void *buf,size_t len)
}ssize_t readline(int sockfd, void *buf, size_t maxline)
else if(ret=0)
nread=ret;
int i;
for(i=0; isock)
maxfd =fd_stdin;
else
maxfd = sock;
while(1)
fputs(recvbuf,stdout);//列印標準輸出
//memset(&sendbuf,0, sizeof(sendbuf));//該段只執行接受伺服器資料
memset(&recvbuf, 0, sizeof(recvbuf));
} if(fd_isset(fd_stdin, &rset))
} close(sock);
}int main(void)
ehco_cli(sock);
return 0;
}
網路程式設計 poll
寫下來,怕忘記了 server include include include include include include include include gettimeofday include struct in addr include inet aton include getpid i...
socket程式設計 select方法使用
0.背景 最近要寫乙個rpc庫,即在客戶端向服務端傳送請求,伺服器計算並返回結果,要求實現服務端能同時接收多個客戶端請求但是不能使用執行緒庫,根據提示我知道了可以使用select函式來完成非阻塞方式工作的程式,於是我就開始了select方法的學習。1.概念 select在socket程式設計中還是比...
網路程式設計 21 poll
三 測試 理解 poll 函式 int poll struct ploofd fds,unsigned long nfds,int timeout 引數 返回值 struct pollfd struct pollfdpollserver.c include common.h intmain int ...