Уважаемый,
У вас очень сумеречное понимание сокетов.
1. При чем тут "Веб" из заголовка вопроса? Это обычные TCP. WebSocket это совершенно другое, загляните в документацию.
2. "я не использовал и не создавал структуры sockaddr" - мои глаза меня обманывают?
Без sockaddr вы не смогли бы забиндить порт в сервере, и определить адрес\порт назначения в клиенте, не говоря о протоколе.
3. "я не использовал функцию getaddrinfo()" - круто!!! Вау!! ... и что?
Функция getaddrinfo(3) объединяет действия функций getipnodebyname(3), getipnodebyaddr(3), getservbyname(3) и getservbyport(3) в одном интерфейсе. Функция getaddrinfo(3) создает одну или несколько структур адресов сокета, которые в дальнейшем могут быть использованы в вызовах функций bind(3) или connect(3) для создания сокета клиента или сервера.
4. "А структуру и функцию, которую я написал сверху - это нововедение." - КАКУЮ СТРУКТУРУ??? КАКУЮ ФУНКЦИЮ??? void error(const char *msg) - это??? Это потрясающее нововведение! Нобелевскую премию мира и нобелевскую премию по литературе вам! Их все равно сейчас дают людям далеким от мира и от литературы.
5. "Или я что-то не понимаю." - ни-че-го. Ничего вы не понимаете. Прочтите, наконец, документацию по программированию сокетов, ПРЕЖДЕ чем задават вопрос, в котором совершенно непонятно о чем вопрос.
... а еще лучше - бросайте программирование.