2013-03-23 2 views
8

В моем коде у меня есть асинхронный ввод-вывод с портами ввода-вывода ввода-вывода, а для завершения чтения/записи обратных вызовов я получаю РУЧКУ (это, конечно, может быть сокет, дескриптор файла, именованный канал и т. Д.). Итак, если что-то не так в такой рутине, я хочу проверить ошибку, но как узнать, является ли ее «сетевой» HANDLE [SOCKET, поэтому я должен называть WSAGetLastError()] или «несетевой» HANDLE [named труб, файлов и т. д., поэтому я должен назвать GetLastError()]? Я использую для этого простой флаг, но его уродливый и невосприимчивый. Если кто-то может подтвердить, что WSAGetLastError() является просто псевдонимом для GetLastError(), я буду использовать только последний.Является ли WSAGetLastError() просто псевдонимом для GetLastError()?

Кажется, так:

http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.networks/2007-08/msg00034.html

http://us.generation-nt.com/wsagetlasterror-just-an-alias-getlasterror-help-28256642.html

Но кто-то может подтвердить? MSDN не очень понятна в этой теме.

И: было бы безопасно использовать GetLastError() вместо WSAGetLastError()? Я имею в виду, что если WSAGetLastError() даже является псевдонимом GetLastError(), поскольку Windows95, как утверждают некоторые, может предположить, что это будет верно для следующей версии Windows, но мы не можем писать хороший код при принятии вещей :)

ответ

9

Это просто оболочка GetLastError, если вы отмените разработку ws2_32.dll, вы найдете ее.

+0

Да, я видел это, но вы бы использовали GetLastError() вместо WSAGetLastError()? Я не думаю, что они отделяют эти 2 функции, теперь –

+1

Я думаю, что это безопаснее использовать WSAGetLastError из-за определенных ошибок Winsock. Но это только мое мнение. – Xearinox

+1

Чистое использование функции, предлагаемой документацией, однако в данном конкретном случае маловероятно, что эти два будут когда-либо разбиваться на отдельные функции. –

5

Причина позади с двумя аналогичными функциями: http://blogs.msdn.com/b/oldnewthing/archive/2005/09/08/462402.aspx

Почему функция WSASetLastError существуют, когда есть уже вполне хорошая функция SetLastError?

Собственно, вы тоже знаете ответ, если вы сядете и подумаете об этом.

Winsock был первоначально разработан для работы как на 16-битной Windows, так и на 32-битной Windows. Обратите внимание, как классические функции Winsock основаны на сообщениях окна для асинхронных уведомлений. В 16-битном мире не было функции SetLastError. Поэтому Winsock должен был предоставить свою версию для 16-битной реализации. И поскольку совместимость с исходным кодом важна, также была 32-разрядная версия. Конечно, 32-битная версия выглядит глупостью в ретроспективе, если вы не знаете о 16-битной версии.

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