Мое приложение будет отправлять огромное количество данных по сети, поэтому я решил (потому что я использую 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, не будет ли медлительность, когда у меня будет столько сокетов?должен сначала стать читаемым, и пройдет некоторое время, прежде чем сокет станет доступным для записи.Могу ли я быть уверен, что в момент, когда сокет становится доступным для записи, дескриптор файла все еще читается (чтобы избежать блокировки вызова)?