私のアプリケーションはネットワーク経由で大量のデータを送信する予定なので、(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 ソケットを開くと仮定します。次の 2 点についてお尋ねします。
- 非常に多くの epoll_ctl 呼び出しが発生しますが、非常に多くのソケットを使用すると遅くなりませんか?
- ファイル記述子は最初に読み取り可能になる必要があり、ソケットが書き込み可能になるまでにある程度の間隔があります。ソケットが書き込み可能になった時点で、ファイル記述子がまだ読み取り可能であることを確認できますか (呼び出しのブロックを回避するため)。