我的应用程序将通过网络发送大量数据,因此我决定(因为我使用的是Linux)使用epoll和splic.这是我的看到方式(伪代码):
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调用,当我有这么多套接字时,会不会很慢?
>文件描述符必须首先变得可读取,并且套接字必须可写之前要间隔一段时间.我能确定的是,当套接字变为可写文件描述符的那一刻仍然可读(以避免阻塞调用)?
解决方法:
第一个问题
>您可以使用边缘触发而不是触发轮询,因此不必每次都删除套接字.
>您可以使用EPOLLONESHOT防止卸下插座
File descriptor has to become readable first and there will be some interval before socket will become writable.
什么样的文件描述符?如果此文件在文件系统上不能使用选择/轮询或其他工具来实现,则无论磁盘和缓存处于什么状态,该文件始终是可读或可写的.如果您需要异步工作人员,则可以使用aio_ * API,但通常只是从文件读取到文件写入,并假定它是非阻塞的.
如果它是TCP套接字,那么大多数时候它是可写的.最好用
非阻塞调用,并在收到EWOULDBLOCK时将套接字放入epoll.