В чем разница между сокетом и HANDLE в Windows? - PullRequest
9 голосов
/ 13 января 2011

Я пытаюсь заставить сервер Linux работать в Windows.

Сокет и дескриптор файла обрабатываются одинаково в Linux.Некоторые системные API доступны как для сокетов, так и для файловых дескрипторов.

Однако я имею дело с сокетами Winsock и HANDLE (файловыми дескрипторами) с помощью WIN API.

Так что мне нужно знать, что целое числосокет или HANDLE.

Теперь возникает вопрос:

Будет ли возвращаемое значение от socket () и open () одинаково в Windows?

Если они всегда разные, я могу написать свой собственный сокет () и open (), чтобы обернуть системный.и запишите возвращаемое значение из системного API, независимо от того, является ли целое число сокетом или HANDLE.

Если они будут одинаковыми, я понятия не имею с этим справиться.

Ответы [ 2 ]

13 голосов
/ 14 января 2011

Дескрипторы сокетов являются дескрипторами Win32 (ядро NT), поэтому вы можете, например, использовать ReadFile или WriteFile на них.Существует также состояние пользовательского режима, связанное с дескриптором, которое поддерживается Winsock, поэтому вам нужно использовать closesocket () вместо CloseHandle ().

open () возвращает дескрипторы файлов CRT, которые отличаются от дескриптора Win32.Вы можете создать дескриптор файла CRT, используя _open_osfhandle () .Но это не рекомендуется для сокетов, потому что вы не можете закрыть файл чистым способом.Вы либо используете close (), который пропускает состояние пользовательского режима Winsock, либо closesocket (), который пропускает дескриптор CRT.

0 голосов
/ 13 января 2011

Будет ли возвращаемое значение из сокета () и open () будет одинаковым в Windows?

Дескрипторы сокетов в Windows выделяются подсистемой WINSOCK, которая вообще не является частью файловой системы.

...