如何区分“侦听器”文件描述符和“客户端”文件描述符?
这是我在手册页示例中看到的内容:
if(events[n].data.fd == listener) {
...
} else {
...
}
'但是如果我没有访问权限怎么办listener
?
对不起,如果这是一个模糊的问题。我不太确定如何措辞。
假设您正在编写服务器,您应该将侦听套接字描述符保留在某个变量中(listener
在手册页中),或者为您提供的每个套接字设置一个小结构并用成员epoll_ctl(2)
指向它(不要忘记在套接字关闭时取消分配该结构)。data.ptr
struct epoll_event
像这样的东西:
struct socket_ctl
{
int fd; /* socket descriptor */
int flags; /* my info about the socket, say (flags&1) != 0 means server */
/* whatever else you want to have here, like pointers to buffers, etc. */
};
...
struct socket_ctl* pctl = malloc( sizeof( struct socket_ctl ));
/* check for NULL */
pctl->fd = fd;
pctl->flags = 1; /* or better some enum or define */
struct epoll_event ev;
ev.events = EPOLLIN|...;
ev.data.ptr = pctl;
...
if (( events[n].data.ptr->flags & 1 ) != 0 )
{
/* this is server socket */
}
正如你所看到的,它比仅仅访问服务器套接字描述符要做更多的工作,但它有一个很好的属性,可以将与一个套接字相关的所有信息保存在一个地方。