Как работать с сокетами на с++?
Уважаемый, 
У вас очень сумеречное понимание сокетов.
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. "Или я что-то не понимаю." - ни-че-го. Ничего вы не понимаете. Прочтите, наконец, документацию по программированию сокетов, ПРЕЖДЕ чем задават вопрос, в котором совершенно непонятно о чем вопрос.
... а еще лучше - бросайте программирование.
Можно не использовать ни структуры sockaddr, ни getaddrinfo(), ни getipnodebyname() явно и даже можно вообще не знать о них. Они используются в любом случае где-то глубже внутри, т.к. это низкоуровневые, базовые методы работы с сокетами и с сетевыми протоколами в целом. 
Как уже заметили выше, то что вы используете - это не веб-сокеты. Веб-сокеты это более высокоуровневый протокол, чем обычные сокеты. 

P.S. скопированный код из сети не может считаться написанным вами. (хоба)