Основываясь на вашей отредактированной версии вопроса, я не уверен, что вам нужно «unlisten» или close(). Вам приходят в голову два варианта:
1) После того, как вы вызываете listen(), соединения фактически не принимаются до (логически достаточно), которые вы вызываете accept(). Вы можете «unlisten» просто проигнорировать активность сокета и отложить любой accept() до тех пор, пока вы не будете готовы к ним. Любое входящее соединение пытается создать резервную копию в очереди, которая была создана при открытии порта в режиме прослушивания. Как только очередь задержек заполнена в стеке, дальнейшие попытки соединения просто отбрасываются на пол. Когда вы возобновляете с accepts(), вы быстро деактивируете отставание и будьте готовы к большему количеству подключений.
2) Если вы действительно хотите, чтобы порт отображался полностью закрытым временно, вы можете динамически применить фильтр пакетов уровня ядра к порту, чтобы предотвратить попытки входящего подключения в сетевой стек. Например, вы можете использовать фильтр пакетов Berkeley (BPF) на большинстве платформ * nix. То есть вы хотите удалить входящие пакеты, входящие в порт интереса, используя функции брандмауэра платформы. Это, конечно, зависит от платформы, но это возможный подход.
shutdown() может быть разрешен, но единственные значения, которые я ожидал получить, будут 0 или 2, что в любом случае остановит всю полезность в слуховом соке. close() проще и более чем достаточно явным, особенно в (я предполагаю) C. – 2008-10-02 12:01:56