Вызов close
и shutdown
оказывают два разных эффекта на базовый сокет.
Первое, на что следует обратить внимание, это то, что сокет является ресурсом в базовой ОС, и несколько процессов могут иметь дескриптор для одного и того же базового сокета.
Когда вы вызываете close
, он уменьшает количество дескрипторов на единицу, а если количество дескрипторов достигло нуля, тогда сокет и связанное с ним соединение проходят через обычную процедуру закрытия (эффективно отправляя FIN / EOF равноправному узлу) и сокет освобожден.
Здесь следует обратить внимание на то, что если счетчик дескрипторов не достигает нуля, поскольку другой процесс все еще имеет дескриптор сокета, то соединение не закрывается и сокет не освобождается.
С другой стороны, вызов shutdown
для чтения и записи закрывает базовое соединение и отправляет FIN / EOF одноранговому узлу независимо от того, сколько процессов имеет дескрипторы для сокета. Тем не менее, не освобождает сокет, и вам все равно необходимо после этого вызвать close.