Всё должно быть ясно по смыслу. Давай закрепим: socket() просто создаст пустую структуру сокета
bind() связка структуры сокета с адресом:портом или именем файла. Для UDP-сокетов уже сразу откроет порт
для локальных "UNIX"-сокетов мэпящихся на пайп, файл ситуация определяется часто только локально и сокет будет работать только в одну сторону.
Чтобы обеспечить двухстороннюю фулдуплесную работу необходимо два сокета. За подробностями и примерами кода идем в «Beej's Guide to Interprocess Communication»
https://beej.us/guide/bgipc/html/split/unixsock.html#unixsock
// для UDP или для "локальных", они же "UNIX" сокетов двух вызовов socket(), bind() будет достаточно для работы.
conect() - только для TCP-клиентов, производит коннект на удаленный адрес
listen() - только для TCP-серверов, создает слушающий сокет (например порт 80 у TCP-сервера)
accept() - только для TCP-серверов, из очереди соединений (коннектов клиентов на предыдущий сокет созданный listen()) создаст и вернет новый сокет TCP клиент-сервер соединения
send()
recv() - с этим всё понятно, учитывать что recv() может принять 0 байтов, это не ошибка
shutdown() - грубо рубануть сокет, вторая сторона узнает в случае TCP об этом только по таймауту
close() - нормально закрыть соединение с обменом пакетами.