-
Notifications
You must be signed in to change notification settings - Fork 68
WinSock select() в Win64
sobolev edited this page Nov 4, 2018
·
3 revisions
Проект 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-битных величин.