Win32 ::shutdown() возвращает -1, но WSAGetLastError() возвращает 0?

При переносе некоторых рабочих модульных тестов с Linux на Windows я столкнулся со странной проблемой. Похоже, что когда мои тесты переходят к выключению сокета сервера, shutdown() возвращает -1, но WSAGetLastError() возвращает 0 (и getsockopt(с SO_ERROR) возвращает 0, а GetLastError() возвращает 0)... Итак, shutdown( ) говорит мне, что есть ошибка, но все обычные вызовы, чтобы узнать, в чем была проблема, возвращают «нет проблем!»... Кто-нибудь когда-нибудь видел это раньше?

Код, вызывающий завершение работы, выглядит следующим образом:

int ret = ::shutdown( _sok, mode );
if( ret < 0 )
    X_THROW(( XSDK::ModuleId, XSDK::F_OS_ERROR, "Unable to shutdown socket."));

Когда я перехватываю исключение, я вызываю все эти функции GetLastError()... Сбрасывает ли сброс последние ошибки?


person dicroce    schedule 10.11.2010    source источник
comment
Можете ли вы опубликовать код? Просто интересно, у вас есть чек вроде if (error = SOCKET_ERROR)...   -  person Steve Townsend    schedule 10.11.2010
comment
Что делает X_THROW? Если он сделает какой-либо другой системный вызов, это может сбросить код ошибки.   -  person casablanca    schedule 10.11.2010
comment
Глядя на X_THROW(), я не вижу, чтобы он делал что-либо, что могло бы устранить ошибку... Он просто регистрирует ошибку через наш регистратор (который в Windows записывает сообщение в файл), а затем создает объект исключения и бросает это... наш объект исключения наследуется от std::exception..   -  person dicroce    schedule 10.11.2010
comment
@dicroce: записывает сообщение в файл, которое считается системным вызовом и, вероятно, сбрасывает код ошибки. Вам нужно вызвать GetLastError или WSAGetLastError перед любым другим системным вызовом.   -  person casablanca    schedule 10.11.2010
comment
Я пошел дальше и пересобрал библиотеку с помощью вызова shutdown()... Я добавил вызов WSAGetLastError() прямо перед X_THROW и, конечно же, я получил обратно 10057... Итак, вопрос в том... Что вызывает ошибку код очистить? Какой-то системный вызов?   -  person dicroce    schedule 10.11.2010
comment
Да, практически любой системный вызов сбросит код ошибки. А поскольку большинство вызовов стандартных библиотек в конечном итоге вызывают системные вызовы, они также косвенно сбрасывают код ошибки. Вот почему вы должны немедленно получить код.   -  person casablanca    schedule 10.11.2010
comment
@casablanca, вы должны написать это как ответ, чтобы получить баллы   -  person Steve Townsend    schedule 10.11.2010


Ответы (1)


В итоге оказалось, что почти любые системные вызовы могут сбросить ошибки Win32 «LastError()». сразу вызывал WSAGetLastError() в моем catch(...), было уже слишком поздно...

person dicroce    schedule 10.11.2010