2011-01-13 32 views
7

Sto provando a far funzionare un server Linux in Windows.Qual è la differenza tra socket e HANDLE in Windows?

Il socket e il descrittore di file sono trattati allo stesso modo in Linux. Alcune API di sistema sono disponibili sia per il socket che per il descrittore di file.

Tuttavia, mi occupo del socket di Winsock e HANDLE (descrittore di file) tramite l'API WIN.

Quindi ho bisogno di sapere che un numero intero è un socket o un HANDLE.

Ora qui è la domanda:

sarebbe il valore restituito da socket() e open() essere lo stesso in Windows?

Se sono sempre diversi, posso scrivere il mio socket() e open() per avvolgere quello del sistema. e registra il valore di ritorno dalla api di sistema se il numero intero è un socket o HANDLE.

Se saranno uguali, non ho idea di affrontarlo.

+0

"Lo stesso" in che senso? – EJP

+0

lo stesso valore. – Celebi

risposta

10

Gli handle di socket sono handle Win32 (kernel NT) in modo che sia possibile utilizzare, ad esempio, ReadFile o WriteFile. C'è anche uno stato in modalità utente associato all'handle che viene gestito da Winsock ed è per questo che è necessario usare closesocket() invece di CloseHandle().

open() restituisce descrittori di file CRT diversi dall'handle di Win32. È possibile creare un descrittore di file CRT utilizzando _open_osfhandle(). Ma questo non è raccomandato per i socket perché non puoi chiudere il file in modo pulito. Si utilizza close() che perde lo stato di modalità utente Winsock o closesocket() che perde il descrittore CRT.

+0

Se possibile, puoi spiegare quanto e quale tipo di stato della modalità utente è associato alle maniglie di 'SOCKET'? Questo è importante perché lo stato come le cache può influenzare il modo in cui le funzioni socket interagiscono con le funzioni senza socket. –

+0

@Seven, Winsock 2 ha un'architettura "Layered Service Provider", quindi Winsock mantiene una mappatura da handle a provider. Ogni fornitore può mantenere uno stato aggiuntivo. Quale stato aggiuntivo è mantenuto (se esiste) è il dettaglio dell'implementazione. Gli LSP probabilmente non memorizzano nella cache/nel buffer i dati inviati o ricevuti in quanto ciò interromperà la compatibilità con le applicazioni che utilizzano ReadFile o WriteFile sugli handle di socket. – John

-1

Il valore di ritorno dal socket() e open() è lo stesso in Windows?

Gli handle di socket in Windows sono allocati dal sottosistema WINSOCK che non fa parte del file system.

+0

Questo era vero in passato ma a partire da handle di socket di Windows NT ora sono oggetti kernel completi e non solo implementati come DLL in modalità utente anche se al giorno d'oggi c'è ancora uno stato di modalità utente. –

Problemi correlati