poll使用示例

来源:互联网 发布:淘宝办签证泄露信息 编辑:程序博客网 时间:2024/05/02 00:10

server.cpp

#include <stddef.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#include <unistd.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netinet/tcp.h>#include <sys/select.h>#include <poll.h>#include <netdb.h>#include <limits.h>#define ip "192.168.188.133"#define port 8888#define INFTIM 10000int main(int argc, char* argv[]){int afd, sfd;struct sockaddr_in servaddr;//创建socket文件描述符sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd == -1){perror("sfd == -1");exit(1);}//防止端口复用int reuse = 1 ;setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void*)&reuse, sizeof(reuse));//初始化socketmemset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(port) ;servaddr.sin_addr.s_addr = inet_addr(ip);//绑定套接字if(bind(sfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){perror("bind error");exit(1);}//监听套接字if(listen(sfd, 5) == -1){perror("listen error");exit(1);}struct pollfd fdarr[4];fdarr[0].fd = sfd;fdarr[0].events = POLLIN;for(int i = 1; i < 4; ++i){fdarr[i].fd = -1;}int maxfd = sfd;int confd;int i = 1;while(1){int flag = poll(fdarr, maxfd + 1, INFTIM);if(flag == -1){perror("poll error");exit(1);}if(fdarr[0].revents & POLLIN)//监听套接字可读{confd = accept(sfd, NULL, NULL);for(i = 1; i < 4; ++i){if(fdarr[i].fd == -1){fdarr[i].fd = confd;fdarr[i].events = POLLIN;break;}}if(i == 4){perror("too many client");exit(1);}if(fdarr[i].fd > maxfd){maxfd = fdarr[i].fd;}}for(i = 1; i < 4; ++i){if(fdarr[i].fd == -1){continue;}if(fdarr[i].revents & (POLLIN | POLLERR)){int readn;char buf[10];memset(buf, 0, 10);if((readn = read(fdarr[i].fd, buf, 10)) < 0){if(errno == ECONNRESET){close(fdarr[i].fd);fdarr[i].fd = -1;}else{perror("read error");}}else if(readn == 0){close(fdarr[i].fd);fdarr[i].fd = -1;}else{printf("%s\n", buf);}}}}//关闭套接字close(sfd);return 0;}

client.cpp同上一篇select

poll与select区别在于文件描述符没有上限,select是1024个


0 0
原创粉丝点击