Виклик close
і shutdown
має два різні ефекти на нижній розетці.
Перше, що слід зазначити, це те, що сокет - це ресурс базової ОС, і кілька процесів можуть мати ручку для одного і того ж базового сокета.
Якщо ви називаєте close
це декрементацією, кількість оброблюваних ручок на одиницю, і якщо кількість ручки досягає нуля, то розетка та пов'язане з цим з'єднання проходять через звичайну процедуру закриття (ефективно відправляючи FIN / EOF на одноранговий), і сокет розміщується.
На що тут слід звернути увагу, це те, що якщо кількість ручки не досягає нуля, оскільки інший процес все ще має ручку до сокета, то з'єднання не закрите і розетка не розміщена.
З іншого боку, виклик shutdown
читання та запису закриває базове з'єднання та надсилає FIN / EOF однорангові незалежно від того, скільки процесів має ручки до сокета. Однак це не роз'єднує розетку, і вам все одно потрібно зателефонувати після закриття.
shutdown()
робить :)