Skip to the content.
Mindful Networking: Port Management and Testing | AI Systems Design From Scratch

Connect with Amin Boulouma Official

AI Systems Design From First Principles - An implementation of AI Systems Design From First Principles | Product Hunt

🏠 Documentation Hub 📝 Engineering Blog 💻 GitHub Repository

Mindful Port Management in Testing

Amin Boulouma, Software Engineer

One of the most frequent frustrations in socket programming is the OSError: [Errno 98] Address already in use. This occurs when you restart a server too quickly after it has been shut down, leaving the OS to keep the port in a TIME_WAIT state.

Understanding the Lifecycle

When a socket is closed, the underlying TCP connection doesn’t vanish instantly. The operating system holds it in a TIME_WAIT state to ensure any delayed packets are properly accounted for. During this window, your attempt to bind to the same local port will fail.

Best Practices for Testing

To ensure a smooth developer experience during your testing cycles, adopt these strategies:

1. Enable SO_REUSEADDR

This is the single most effective way to handle port collisions in development. It tells the kernel that even if the port is in a TIME_WAIT state, it should be reused immediately.

# The standard fix for testing environments
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

2. Design for Cleanup

Always wrap your server startup in a try...finally block. This ensures that even if a test fails or you interrupt the script, the socket is explicitly closed, releasing the resource back to the OS.

try:
    server.start()
except KeyboardInterrupt:
    pass
finally:
    server.stop() # Explicitly call close() on the underlying socket

3. Use Dynamic Ports for Unit Tests

If you are running parallel tests, don’t hardcode your port. Configure your tests to bind to port 0. The OS will then automatically assign an available, ephemeral port, preventing collisions entirely.

The Testing Pipeline Flow

Summary Checklist

By treating port availability as a managed resource rather than a static configuration, you eliminate the “flaky test” syndrome that plagues many network-reliant projects.

Connect with Amin Boulouma Official