setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));//绑定name设备去发送消息
setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, name, strlen(name))
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
- fds:是一个struct pollfd结构类型的数组,用于存放需要检测其状态的Socket描述符
struct pollfd{ int fd; //文件描述符 short events; //等待的事件 short revents; //实际发生的事件 };typedef unsigned long int nfds_t;
- timeout:是poll函数调用阻塞的时间,单位:毫秒;
返回值:
>0:数组fds中准备好读、写或出错状态的那些socket描述符的总数量;
==0:数组fds中没有任何socket描述符准备好读、写,或出错
-1: poll函数调用失败,同时会自动设置全局变量errno;
- events和revents的变量值
1.通过open得到对应的fd , 也可通过socket之类的
2.fd.events 设置这个fd需要关心的事件
3.fd.revents 通过poll函数循环调用,看revents是否发生,比如发生POLLIN,表明收到了数据,于是可以用read从fd里去读数据
#include #include #include #include #include #include #include #include #define MAX_BUFFER_SIZE 1024 #define IN_FILES 3 #define TIME_DELAY 60*5 #define MAX(a,b) ((a>b)?(a):(b)) int main() { struct pollfd fds[IN_FILES]; char buf[MAX_BUFFER_SIZE]; int i,res,real_read, maxfd; fds[0].fd = 0; if((fds[1].fd=open("data1",O_RDONLY|O_NONBLOCK)) < 0) { fprintf(stderr,"open data1 error:%s",strerror(errno)); return 1; } if((fds[2].fd=open("data2",O_RDONLY|O_NONBLOCK)) < 0) { fprintf(stderr,"open data2 error:%s",strerror(errno)); return 1; } for (i = 0; i < IN_FILES; i++) { fds[i].events = POLLIN; } while(fds[0].events || fds[1].events || fds[2].events) { if (poll(fds, IN_FILES, TIME_DELAY) <= 0) { printf("Poll error\n"); return 1; } for (i = 0; i< IN_FILES; i++) { if (fds[i].revents) { memset(buf, 0, MAX_BUFFER_SIZE); real_read = read(fds[i].fd, buf, MAX_BUFFER_SIZE); if (real_read < 0) { if (errno != EAGAIN) { return 1; } } else if (!real_read) { close(fds[i].fd); fds[i].events = 0; } else { if (i == 0) { if ((buf[0] == 'q') || (buf[0] == 'Q')) { return 1; } } else { buf[real_read] = '\0'; printf("%s", buf); } } } } } exit(0); }