linux-有关epoll和拼接的问题

我的应用程序将通过网络发送大量数据,因此我决定(因为我使用的是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.

上一篇:牛客网前端编程:在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组


下一篇:为什么拼接不能填充javascript数组上的漏洞?