0

如何区分“侦听器”文件描述符和“客户端”文件描述符?

这是我在手册页示例中看到的内容:

if(events[n].data.fd == listener) {
    ...
} else {
    ...
}

'但是如果我没有访问权限怎么办listener

对不起,如果这是一个模糊的问题。我不太确定如何措辞。

4

1 回答 1

3

假设您正在编写服务器,您应该将侦听套接字描述符保留在某个变量中(listener在手册页中),或者为您提供的每个套接字设置一个小结构并用成员epoll_ctl(2)指向它(不要忘记在套接字关闭时取消分配该结构)。data.ptrstruct 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 */
}

正如你所看到的,它比仅仅访问服务器套接字描述符要做更多的工作,但它有一个很好的属性,可以将与一个套接字相关的所有信息保存在一个地方。

于 2010-06-28T19:01:19.050 回答