Skip to content

WinSock select() в Win64

sobolev edited this page Nov 4, 2018 · 3 revisions

Почему при компиляции под x64 может не работать функция WinSock select()

Проект OpenPapyrus компилируется с выравниванием структур по границе 1 байта (так сделано для того, чтобы избежать проблем с сериализацией объектов). Как выяснилось, Visual Studio полагается на то, что файл winsock.h будет компилироваться с опцией выравнивания по границе 8-байтов. Если это не так, то структура fd_set не правильно обрабатывается внутренней Windows-функцией __WSAFDIsSet в результате select стабильно возвращает ошибку WSAENOTSOCK(10038) поскольку вызов __WSAFDIsSet дает отрицательный ответ. Аналогично, вы получите ошибку в таком тесте:

fd_set wset; FD_SET(S, &wset); assert(FD_ISSET(S, &wset));

Все из-за того, что первый член стурктуры fd_set является 4-байтовым целым, а последующий массив SOCKET[] состоит из 64-битных величин.