В чем разница между socket и HANDLE в Windows?

Я пытаюсь сделать сервер Linux работающим в Windows.

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

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

Поэтому мне нужно знать, что целое число - это сокет или РУЧКА.

Теперь вот вопрос:

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

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

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


person Celebi    schedule 13.01.2011    source источник


Ответы (2)


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

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

person John    schedule 14.01.2011
comment
Если возможно, можете ли вы объяснить, сколько и какое состояние пользовательского режима связано с SOCKET дескрипторами? Это важно, потому что такие состояния, как кеши, могут влиять на то, как функции сокетов взаимодействуют с функциями, не относящимися к сокетам. - person Molossus Spondee; 16.02.2015
comment
@Seven, Winsock 2 имеет многоуровневую архитектуру поставщика услуг, поэтому Winsock сохраняет сопоставление от дескриптора к поставщику. Каждый провайдер может хранить дополнительное состояние. Какое дополнительное состояние сохраняется (если есть) — это детали реализации. LSP, вероятно, не кэшируют/буферизируют отправленные или полученные данные, так как это нарушит совместимость с приложениями, которые используют ReadFile или WriteFile для дескрипторов сокетов. - person John; 23.02.2015

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

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

person user207421    schedule 13.01.2011
comment
Это было правдой в далеком прошлом, но в Windows NT дескрипторы сокетов теперь являются полноценными объектами ядра, а не реализованы исключительно как DLL пользовательского режима, хотя сегодня все еще существует некоторое состояние пользовательского режима. - person Molossus Spondee; 16.02.2015