我的应用程序将通过网络发送大量数据,所以我决定(因为我使用的是 Linux)使用 epoll 和 splice。这是我的看法(伪代码):
epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
while(1)
{
epoll_wait (tmp_structure);
if (tmp_structure->fd == file_descriptor)
{
epoll_ctl (file_fd, EPOLL_CTL_DEL);
epoll_ctl (tcp_socket_fd, EPOLL_CTL_ADD); // wait for EPOLLOUT event
}
if (tmp_structure->fd == tcp_socket_descriptor)
{
splice (file_fd, tcp_socket_fd);
epoll_ctl (tcp_socket_fd, EPOLL_CTL_DEL);
epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
}
}
我假设我的应用程序将打开多达 2000 个 TCP 套接字。我想问你两件事:
- 会有相当多的epoll_ctl调用,当我有这么多套接字时会不会很慢?
- 文件描述符必须首先变得可读,并且在套接字变为可写之前会有一些时间间隔。我可以确定,在套接字变为可写文件描述符的那一刻仍然是可读的(以避免阻塞调用)?