socket网络编程-----I/O复用之poll函数
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <sys/poll.h> #include <sys/time.h> #define BUFSIZE 255 int rw_opt(int rdfd,int wdfd) { int num; char buf[BUFSIZE]; memset(buf,0,sizeof(buf)); num = read(rdfd,buf,sizeof(buf)); if(wdfd == 1) write(1,">>>",3); write(wdfd,buf,num); if(strncmp(buf,"quit",4) == 0) return 0; return num; } int main() { int sockfd,ret; int acceptfd; struct sockaddr_in s_addr; sockfd = socket(AF_INET,SOCK_STREAM,0); if(sockfd == -1) { printf("socket error!\n"); return 0; } memset(&s_addr,0,sizeof(struct sockaddr_in)); s_addr.sin_family = AF_INET; s_addr.sin_port = htons(1234); s_addr.sin_addr.s_addr = htons(INADDR_ANY); ret = bind(sockfd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in)); if(ret == -1) { printf("bind error!\n"); return 0; } ret = listen(sockfd,5); if(ret == -1) { printf("listen error!\n"); return 0; } int addrlen = sizeof(struct sockaddr); acceptfd = accept(sockfd,(struct sockaddr *)&s_addr,&addrlen); if(acceptfd == -1) { printf("accept error!\n"); } else { printf("%s-----%d\n",inet_ntoa(s_addr.sin_addr),ntohs(s_addr.sin_port)); } struct pollfd fds[2]; fds[0].fd=0; fds[1].fd=acceptfd; fds[0].events=POLLIN|POLLOUT; fds[1].events=POLLIN|POLLOUT; while(1) { ret=poll(fds, 2, -1); if(ret<0) { perror("poll"); continue; } if(fds[0].revents&POLLIN) { ret=rw_opt(0, acceptfd); if(ret == 0) break; } if(fds[1].revents&POLLIN) { ret=rw_opt(acceptfd, 1); if(ret == 0) break; } } close(acceptfd); close(sockfd); return 0; }
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <sys/poll.h> #include <sys/time.h> #define BUFSIZE 255 int rw_opt(int rdfd,int wdfd) { int num; char buf[BUFSIZE]; memset(buf,0,sizeof(buf)); num = read(rdfd,buf,sizeof(buf)); if(wdfd == 1) write(1,">>>",3); write(wdfd,buf,num); if(strncmp(buf,"quit",4) == 0) return 0; return num; } int main(int argc,char **argv) { int sockfd,ret; int acceptfd; struct sockaddr_in s_addr; sockfd = socket(AF_INET,SOCK_STREAM,0); if(sockfd == -1) { printf("socket error!\n"); return 0; } memset(&s_addr,0,sizeof(struct sockaddr_in)); s_addr.sin_family = AF_INET; s_addr.sin_port = htons(1234); s_addr.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in)); if(ret == -1) { printf("connect error!\n"); return 0; } struct pollfd fds[2]; fds[0].fd=0; fds[1].fd=sockfd; fds[0].events=POLLIN|POLLOUT; fds[1].events=POLLIN|POLLOUT; while(1) { ret=poll(fds, 2, -1); if(ret<0) { perror("poll"); continue; } if(fds[0].revents&POLLIN) { ret=rw_opt(0,sockfd); if(ret == 0) break; } if(fds[1].revents&POLLIN) { ret=rw_opt(sockfd, 1); if(ret == 0) break; } } close(sockfd); return 0; }