poll的用法和select差不多,但是select的最大文件描述符是由FD_SETSIZE限制,若要改变,那么还得修改宏定义,重新编译内核,很麻烦,但是poll可以通过
ulimit -n xxx //修改文件描述符个数
poll使用链表保存文件描述符
poll和select的缺点是一样的,仍然要采用轮询的方式
看代码
//我们这里的客户端只建立连接,每建立一个连接count就加1;#include#include #include #include #include #include #include #include #include #include using namespace std;int main(){ int count=0; while(1){ int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket() err"); return -1; } struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(8888); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); if (connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { perror("socket() err"); return -1; } cout<<++count<
#include#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;void handler(int sig){ cout< < maxi) maxi=i; break; } } client[i].events=POLLIN;//将conn的事件也设为POLLIN if(--nready<=0) continue; } for(int i=1;i<=maxi;i++){ conn=client[i].fd; if(conn==-1) continue; if(client[i].events&POLLIN){ int rc = read(conn, recvbuf, sizeof(recvbuf));if (rc == 0){ cout<<"client has closed"<
接着分别在客户端终端窗口和服务器终端窗口输入
ulimit -n 2048
接着启动服务端和客户端
看一看到输出了2045,其中0,1,2已被标准输入输出和错误流占用