//下面是用到poll()---
其原型是:int poll(struct pllfd *fds,unsigned int nfds,int timeout);
该函数的功能类似select;
参数一:是一个结构体指针,这里可以用结构体数组;该结构体包含了文件描述
符,对应的事件,发生了就返回其事件
参数二:第一个参数结构体成员的个数
参数三:超时时间(以毫秒为单位)
#include <stdio.h>
2
3 #include <sys/time.h>
4 #include <sys/types.h>
5 #include <unistd.h>
6 #include <fcntl.h>
7
8 #include <sys/types.h> /* See NOTES */
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <arpa/inet.h>
12
13 #include <poll.h>
14
15 #include <string.h>
17 #define PORT 6543
18
19 int main()
20 {
21 /*创建套接字,用于连接*/
22 int s = socket(AF_INET, SOCK_STREAM, 0);
23 if(0 > s){
24 perror("socket");
25 return -1;
26 }
27
28 /*端口重用*/
29 int reuseaddr = 1;
30 if(0 > setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reuseaddr,
sizeof(re useaddr))){
31 perror("setsockopt");
32 return -1;
33 }
34
35 /*绑定server IP及端口号*/
36 struct sockaddr_in addr;
37 memset(&addr, 0, sizeof(struct sockaddr_in));
38 addr.sin_family = AF_INET;
39 addr.sin_port = htons(PORT);
40 addr.sin_addr.s_addr = htonl(INADDR_ANY);
41
42 socklen_t addrlen = sizeof(struct sockaddr_in);
43 if(0 > bind(s, (struct sockaddr *)&addr, addrlen)){
44 perror("bind");
45 return -1;
46 }
47
48 /*设置监听数*/
49 listen(s, 10);
50
51 /*设置套接字为非阻塞*/
52 int val = fcntl(s, F_GETFL, 0);
53 val |= O_NONBLOCK;
54 fcntl(s, F_SETFL, val);
55
56 /*初始化读集合*/
57 #define MAXSET 12
58 struct pollfd fdset[MAXSET];
59 memset(fdset, 0, sizeof(fdset));
60 fdset[0].fd = s;
61 fdset[0].events= POLLIN;
62
63 int i = 0;
64 for(i = 1; i < MAXSET; i++){
65 fdset[i].fd = -1;
66 fdset[i].events= POLLIN;
67 }
68
69 printf("Wait for connecting .\n");
70 while(1){
71 int ret = poll(fdset, MAXSET, -1);
72 if(0 > ret){
73 perror("poll");
74 return -1;
75 }else if(0 == ret){
76 printf("Timeout.\n");
77 continue;
78 }else{
79 /*测试用于连接的套接字,看是否有新连接进来
*/
80 if(POLLIN & fdset[0].revents){
81 struct sockaddr_in newaddr;
82 memset(&newaddr, 0, sizeof(struct
sockaddr_i n));
83 socklen_t newlen = sizeof(struct
sockaddr_in );
84 /*有新连接进来,得到用于读写到套接
字*/
85 int news = accept(s, (struct
sockaddr *)&new addr, &newlen);
86 if(0 > news){
87 perror("accept");
88 return -1;
89 }
90 /*把套接字保存进集合*/
91 if(news >= (MAXSET-3)){
92 printf("No more
connect.\n");
93 close(news);
94 continue;
95 }
96 fdset[news-3].fd = news;
97 printf("New connect: SOCKET[%d], %
s:%d\n", n ews, inet_ntoa(newaddr.sin_addr), ntohs
(newaddr.sin_port));
98 }
99 for(int i = 1; i < MAXSET; i++){
100 /*测试用于读写到套接字,看哪个客户
端发数据进
来*/
101 if(POLLIN & fdset[i].revents){
102 #define MAX 64
103 char buf[MAX];
104 bzero(buf, MAX);
105 int num = recv(fdset[i].fd,
buf, MAX , 0);
106 if(0 >= num){
107 close(fdset[i].fd);
108 printf("SOCKET[%d]
leave.\n" , fdset[i].fd);
109 fdset[i].fd = -1;
110 continue;
111 }
112 printf("SOCKET[%d]: %s[%d]
\n", i, bu f, num);
113 }
114 }
115 }
116 }
117 }
其原型是:int poll(struct pllfd *fds,unsigned int nfds,int timeout);
该函数的功能类似select;
参数一:是一个结构体指针,这里可以用结构体数组;该结构体包含了文件描述
符,对应的事件,发生了就返回其事件
参数二:第一个参数结构体成员的个数
参数三:超时时间(以毫秒为单位)
#include <stdio.h>
2
3 #include <sys/time.h>
4 #include <sys/types.h>
5 #include <unistd.h>
6 #include <fcntl.h>
7
8 #include <sys/types.h> /* See NOTES */
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <arpa/inet.h>
12
13 #include <poll.h>
14
15 #include <string.h>
17 #define PORT 6543
18
19 int main()
20 {
21 /*创建套接字,用于连接*/
22 int s = socket(AF_INET, SOCK_STREAM, 0);
23 if(0 > s){
24 perror("socket");
25 return -1;
26 }
27
28 /*端口重用*/
29 int reuseaddr = 1;
30 if(0 > setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reuseaddr,
sizeof(re useaddr))){
31 perror("setsockopt");
32 return -1;
33 }
34
35 /*绑定server IP及端口号*/
36 struct sockaddr_in addr;
37 memset(&addr, 0, sizeof(struct sockaddr_in));
38 addr.sin_family = AF_INET;
39 addr.sin_port = htons(PORT);
40 addr.sin_addr.s_addr = htonl(INADDR_ANY);
41
42 socklen_t addrlen = sizeof(struct sockaddr_in);
43 if(0 > bind(s, (struct sockaddr *)&addr, addrlen)){
44 perror("bind");
45 return -1;
46 }
47
48 /*设置监听数*/
49 listen(s, 10);
50
51 /*设置套接字为非阻塞*/
52 int val = fcntl(s, F_GETFL, 0);
53 val |= O_NONBLOCK;
54 fcntl(s, F_SETFL, val);
55
56 /*初始化读集合*/
57 #define MAXSET 12
58 struct pollfd fdset[MAXSET];
59 memset(fdset, 0, sizeof(fdset));
60 fdset[0].fd = s;
61 fdset[0].events= POLLIN;
62
63 int i = 0;
64 for(i = 1; i < MAXSET; i++){
65 fdset[i].fd = -1;
66 fdset[i].events= POLLIN;
67 }
68
69 printf("Wait for connecting .\n");
70 while(1){
71 int ret = poll(fdset, MAXSET, -1);
72 if(0 > ret){
73 perror("poll");
74 return -1;
75 }else if(0 == ret){
76 printf("Timeout.\n");
77 continue;
78 }else{
79 /*测试用于连接的套接字,看是否有新连接进来
*/
80 if(POLLIN & fdset[0].revents){
81 struct sockaddr_in newaddr;
82 memset(&newaddr, 0, sizeof(struct
sockaddr_i n));
83 socklen_t newlen = sizeof(struct
sockaddr_in );
84 /*有新连接进来,得到用于读写到套接
字*/
85 int news = accept(s, (struct
sockaddr *)&new addr, &newlen);
86 if(0 > news){
87 perror("accept");
88 return -1;
89 }
90 /*把套接字保存进集合*/
91 if(news >= (MAXSET-3)){
92 printf("No more
connect.\n");
93 close(news);
94 continue;
95 }
96 fdset[news-3].fd = news;
97 printf("New connect: SOCKET[%d], %
s:%d\n", n ews, inet_ntoa(newaddr.sin_addr), ntohs
(newaddr.sin_port));
98 }
99 for(int i = 1; i < MAXSET; i++){
100 /*测试用于读写到套接字,看哪个客户
端发数据进
来*/
101 if(POLLIN & fdset[i].revents){
102 #define MAX 64
103 char buf[MAX];
104 bzero(buf, MAX);
105 int num = recv(fdset[i].fd,
buf, MAX , 0);
106 if(0 >= num){
107 close(fdset[i].fd);
108 printf("SOCKET[%d]
leave.\n" , fdset[i].fd);
109 fdset[i].fd = -1;
110 continue;
111 }
112 printf("SOCKET[%d]: %s[%d]
\n", i, bu f, num);
113 }
114 }
115 }
116 }
117 }