Skip to content

Day48 - epoll and timerfd Idle Timeout

Goal

Implement idle timeout handling in an epoll-based TCP server.


Step 1 - Create timerfd

  • Use timerfd_create()
  • Set periodic timer (1 second)

Step 2 - Add timerfd to epoll

epoll_ctl(epfd, EPOLL_CTL_ADD, timer_fd, &ev);

Step 3 - Handle timer event

read(timer_fd, &expirations, sizeof(expirations));

Update server time:

server.timer_ms = get_current_ticks_ms();

Step 4 - Add client list

  • linked list
  • add on accept
  • remove on destroy

Step 5 - Track last activity

client->last_active_ms = now;

Update on:

  • accept
  • recv > 0

Step 6 - Scan timeout

while (client) {
    next = client->next;

    if (timeout)
        client_destroy();

    client = next;
}

Step 7 - Testing

Run test script:

bash test_timeout.sh

Expected Result

  • idle client is disconnected
  • active client remains connected
  • multiple clients handled correctly