Перенос платформы Windows C++ на POSIX (Linux) C++ — WSAGetLastError()

В настоящее время я переношу некоторый код C++ для Windows Mobile на стандартный C++.

Поэтому я пытаюсь найти альтернативы для конкретных функций Windows.

Мне очень не повезло найти стандартную функцию C++, которая может помочь мне заменить специфичную для Windows функцию WSAGetLastError().

WSAGetLastError() возвращает номера ошибок для ошибок, возникающих с сокетами в Windows.

Поэтому мне было интересно, знает ли кто-нибудь способ заменить эту функцию в стандартном С++?

Было бы достаточно способа получить разные номера ошибок для разных результатов подключения/отключения сокета.


person Donal Rafferty    schedule 04.05.2010    source источник
comment
Не существует такой вещи, как Windows C++, и вы также не пытаетесь перенести на стандартный C++. Вы пытаетесь перенести свою программу с платформы Windows на платформу POSIX. Ни один из них не имеет ничего общего со стандартным С++.   -  person jalf    schedule 04.05.2010
comment
Вы должны заметить, что в документации для всех функций сокетов указано, где они хранят информацию об ошибках. Например: linux.die.net/man/2/bind. Вы все равно будете читать всю эту документацию, потому что функции сокетов работают по-разному в разных операционных системах. Функции сокетов в Linux не обязательно ведут себя так же, как функции с теми же именами в Windows. Обратите особое внимание на угловые случаи.   -  person Rob Kennedy    schedule 04.05.2010
comment
Спасибо за дополнительную информацию, очень признательна   -  person Donal Rafferty    schedule 05.05.2010


Ответы (2)


Стандартные функции C++, поддерживающие сокеты, отсутствуют. Однако все функции сокета POSIX должны устанавливать переменную errno при ошибке — вам просто нужно проверить это — она должна быть объявлена ​​в errno.h.

person Community    schedule 04.05.2010
comment
Если вы используете неблокирующие подключения, вам также потребуется использовать getsockopt(socket, SOL_SOCKET, SO_ERROR, ...); для получения статуса connect(). И имейте в виду, что errno не изменяется при успешных операциях, поэтому вы можете специально установить его на ноль перед каждой операцией. - person caf; 05.05.2010
comment
Установка errno на ноль не является хорошей практикой. Вместо этого вы должны проверять его только в том случае, если возвращаемое значение вызова функции указывает на ошибку. - person ; 05.05.2010

Я бы перенес на Boost.ASIO, который абстрагирует сетевые различия и, вероятно, даст вам лучшую производительность за счет использования асинхронных вызовов и перекрывающихся операций ввода-вывода. Когда вы закончите, ваш код будет работать везде, где работает boost.

person bytemaster    schedule 05.08.2012