Под капотом bind
присваивает адрес и порт дескриптору сокета. Это означает, что порт теперь зарезервирован для этого сокета, и поэтому система не сможет назначить тот же порт другому приложению (существует исключение, но я не буду здесь вдаваться в подробности). Это также однократная операция для каждого сокета.
Затем listen
отвечает за установление количества соединений, которые могут быть поставлены в очередь для данного дескриптора сокета, и указывает, что теперь вы готовы принимать соединения.
С другой стороны, accept
используется для удаления первого соединения из очереди ожидающих соединений и создания нового сокета для обработки дальнейшего взаимодействия через него. Его можно вызывать несколько раз, и обычно это так. По умолчанию эта операция блокируется, если в очереди нет подключений.
Теперь предположим, что вы хотите использовать механизм асинхронного ввода-вывода (например, epoll, poll, kqueue, select и т. д.). Если бы listen и accept были одним API, как бы вы указали, что данный сокет готов принимать соединения? Асинхронный механизм должен знать, что вы также хотите обрабатывать события этого типа.
Имея совершенно разную семантику, имеет смысл разделить их.
person
jweyrich
schedule
06.02.2011