Ответ 1
Между GetLastError и errno нет никакой связи. GetLastError получает последнюю ошибку, возникающую в функции Windows API (для текущего потока). errno содержит последнюю ошибку, которая произошла в библиотеке времени выполнения C (я думаю, что это также зависит от потока для библиотеки времени выполнения Microsoft C). Поэтому, если вы вызываете функцию winapi, такую как CreateFile, вы проверяете GetLastError (предполагая, что вызов функции завершился неудачно), а если вы вызываете функцию библиотеки времени выполнения C, например fopen, вы проверяете errno (опять-таки, что вызов был неудачным).
Я думаю, что также отвечает на вопрос об использовании FormatMessage и strerror_s.
Я не знаю, всегда ли WSAGetLastError возвращает те же значения, что и GetLastError (хотя я замечаю, что список кодов ошибок, возвращаемых GetLastError, включает коды ошибок, которые может возвращать WSAGetLastError). См. Коды системных ошибок (9000-11999). Если вы посмотрите на коды ошибок, начинающиеся примерно с 10000, вы увидите коды ошибок WSAGetLastError.
В любом случае, я лично не буду полагаться на них, возвращая те же значения. Почему это было бы полезно? Просто следуйте документации и вызовите WSAGetLastError для функций Winsock2 и GetLastError для других функций winapi. ПРИМЕЧАНИЕ. Вы можете использовать FormatMessage для кодов ошибок, возвращаемых любой из функций.