2010-11-10 2 views
2

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

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

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

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

+1

Можете ли вы опубликовать код? Просто интересно, что у вас есть проверка типа 'if (error = SOCKET_ERROR)' ... –

+0

Что делает 'X_THROW'? Если он вызывает другой системный вызов, это может привести к сбросу кода ошибки. – casablanca

+0

Глядя на X_THROW(), я не вижу в этом ничего, что могло бы устранить ошибку ... Он просто регистрирует ошибку через наш регистратор (который на окнах, пишет сообщение в файл), а затем создает объект исключения и throw's it ... наш объект исключения наследуется от std :: exception .. – dicroce

ответ

2

Ответ в итоге заключался в том, что почти любые системные вызовы могут очищать ошибки «LastError()» Win32 ... В моем случае бросание исключения означало форматирование и протоколирование сообщения, из-за чего ошибка была ясной ... И хотя я сразу вызвал WSAGetLastError() в мой улов (...), было уже слишком поздно ...

Смежные вопросы