网销的网站建设与管理,信用信息查询公示系统,求免费的那种网站有哪些,附近临时工200元一天文章目录 1.poll系统调用的作用2.poll的原型3.poll支持的事件类型4.poll实现TCP服务器(1)服务器端代码:(2)客户端代码:(3)运行结果截图: 1.poll系统调用的作用
poll 系统调用和 select 类似#xff0c;也是在指定时间内轮询一定数量的文件描述符#xff0c;以测试其中是否有… 文章目录 1.poll系统调用的作用2.poll的原型3.poll支持的事件类型4.poll实现TCP服务器(1)服务器端代码:(2)客户端代码:(3)运行结果截图: 1.poll系统调用的作用
poll 系统调用和 select 类似也是在指定时间内轮询一定数量的文件描述符以测试其中是否有就绪者。
2.poll的原型 #include poll.h int poll(struct pollfd *fds, nfds_t nfds, int timeout); poll 系统调用成功返回就绪文件描述符的总数超时返回 0失败返回-1 nfds 参数指定被监听事件集合 fds 的大小。 timeout 参数指定 poll 的超时值单位是毫秒timeout 为-1 时poll 调用将永久阻塞直到某个事件发生timeout 为 0 时poll 调用将立即返回。
fds 参数是一个 struct pollfd 结构类型的数组它指定所有用户感兴趣的文件描述符上发生的可读、可写和异常等事件。pollfd 结构体定义如下 struct pollfd { int fd; // 文件描述符 short events; // 注册的关注事件类型 short revents; // 实际发生的事件类型由内核填充 }; 其中fd 成员指定文件描述符events 成员告诉 poll 监听 fd 上的哪些事件类型。 它是一系列事件的按位或revents 成员则有内核修改通知应用程序 fd 上实际发生了哪些事件。poll 支持的事件类型如下
3.poll支持的事件类型 4.poll实现TCP服务器
(1)服务器端代码:
#includestdio.h
#includeunistd.h
#includestdlib.h
#includepthread.h
#includestring.h
#includearpa/inet.h
#includenetinet/in.h
#includesys/select.h
#includesys/socket.h
#includepoll.h#define MAXFD 10
int socket_init();
int accept_client(int sockfd);
void fds_init(struct pollfd fds[]);
void fds_add(int fd,struct pollfd fds[]);
void fds_del(int fd,struct pollfd fds[]);
void recv_data(int c,struct pollfd fds[]);
int main()
{int sockfdsocket_init();if(sockfd-1){exit(0);}struct pollfd fds[MAXFD];fds_init(fds);fds_add(sockfd,fds);//sockfd-fdwhile(1){int npoll(fds,MAXFD,5000);if(n-1){printf(poll error\n);}if(n0){printf(time out\n);}else{for(int i0;iMAXFD;i){if(fds[i].fd-1){continue;}if(fds[i].revents POLLIN){if(fds[i].fd sockfd){int caccept_client(sockfd);if(c!-1){fds_add(c,fds);}}else{recv_data(fds[i].fd,fds);}}}}}}int socket_init()
{int sockfdsocket(AF_INET,SOCK_STREAM,0);if(sockfd-1){return -1;}struct sockaddr_in saddr;memset(saddr,0,sizeof(saddr));saddr.sin_familyAF_INET;saddr.sin_porthtons(5678);saddr.sin_addr.s_addrinet_addr(127.0.0.1);int resbind(sockfd,(struct sockaddr*)saddr,sizeof(saddr));if(res-1){printf(bind error\n);return -1;}reslisten(sockfd,5);if(res-1){return -1;}return sockfd;
}
int accept_client(int sockfd)
{struct sockaddr_in caddr;int lensizeof(caddr);int caccept(sockfd,(struct sockaddr*)caddr,len);return c;
}void fds_init(struct pollfd fds[])
{for(int i0;iMAXFD;i){fds[i].fd-1;fds[i].events0;fds[i].revents0;}
}void fds_add(int fd,struct pollfd fds[])
{for(int i0;iMAXFD;i){if(fds[i].fd-1){fds[i].fdfd;fds[i].eventsPOLLIN;fds[i].revents0;break;}}
}void fds_del(int fd,struct pollfd fds[])
{for(int i0;iMAXFD;i){if(fds[i].fdfd){fds[i].fd-1;fds[i].events0;fds[i].revents0;break;}}
}void recv_data(int c,struct pollfd fds[])
{char buff[128];int nrecv(c,buff,127,0);if(n0){close(c);fds_del(c,fds);printf(client close\n);return ;}printf(recv:%s\n,buff);send(c,ok,2,0);
}(2)客户端代码:
#includestdio.h
#includeunistd.h
#includestdlib.h
#includestring.h
#includesys/socket.h
#includearpa/inet.h
#includenetinet/in.hint socket_init();int main()
{int sockfdsocket_init();if(sockfd-1){exit(0);}while(1){printf(input:);char buff[128]{0}; fgets(buff,127,stdin);if(strncmp(buff,end,3)0){break;}send(sockfd,buff,strlen(buff)-1,0);memset(buff,0,128);recv(sockfd,buff,127,0);printf(read:%s\n,buff);}close(sockfd);exit(0);}int socket_init()
{int sockfdsocket(AF_INET,SOCK_STREAM,0);//tcp流式服务if(sockfd-1){printf(socket errror\n);return -1;}struct sockaddr_in saddr;memset(saddr,0,sizeof(saddr));saddr.sin_familyAF_INET;saddr.sin_porthtons(5678);saddr.sin_addr.s_addrinet_addr(127.0.0.1);int resconnect(sockfd,(struct sockaddr*)saddr,sizeof(saddr));if(res-1){printf(connect error\n);return -1;}return sockfd;
}(3)运行结果截图: