Допустим, ты не хочешь, чтобы сокет отправлял данные, но зато хочешь принимать. Или наоборот. Как это сделать?
Вызов close() закрывает сокет и для приема, и для передачи, и также освобождает связанные с ним ресурсы. Если же ты хочешь закрыть только одно направление передачи, используй shutdown().
Параметр s передает данный сокет, а действие передается параметром how, который может быть равен SHUT_RD, чтобы остановить прием, SHUT_WR чтобы остановить передачу, или SHUT_RDWR, чтобы сделать и то, и другое.
Учти, что shutdown() не освобождает ресурсы, и тебе все равно нужно будет вызвать close(), даже если закрыты оба направления передачи.
Эта функция используется редко.