2011-01-13 14 views
7

WindowsでLinuxサーバを稼働させようとしています。WindowsのソケットとHANDLEの違いは何ですか?

ソケットとファイル記述子は、Linuxでも同じように扱われます。 一部のシステムAPIは、ソケット記述子とファイル記述子の両方に使用できます。

しかし、私はWIN APIでWinsockとHANDLE(ファイル記述子)でソケットを扱います。

したがって、整数はソケットまたはハンドルであることを知る必要があります。

ソケット() およびオープン()からの戻り値は、Windowsで同じのようになります。今ここに

が問題ですか?

常に異なる場合は、私自身のsocket()とopen()を記述してシステムのものをラップすることができます。 であり、整数がソケットかHANDLEかどうかにかかわらず、システムのapiからの戻り値を記録します。

もしそれらが同じであれば、私はそれに対処する考えはありません。

+0

「同じ」という意味では? – EJP

+0

は値が同じです。 – Celebi

答えて

10

ソケットハンドルはWin32(NTカーネル)ハンドルです。たとえば、ReadFileまたはWriteFileを使用することができます。また、Winsockによって管理されているハンドルに関連付けられたユーザーモード状態もあり、CloseHandle()ではなくclosesocket()を使用する必要があります。

open()は、Win32ハンドルとは異なるCRTファイル記述子を返します。 _open_osfhandle()を使用してCRTファイル記述子を作成できます。しかし、あなたはきれいな方法でファイルを閉じることができないので、これはソケットのために推奨されていません。 close()を使用するとWinsockのユーザーモード状態がリークし、closesocket()はCRTディスクリプタをリークします。

+0

可能であれば、 'SOCKET'ハンドルにどのくらいの種類のユーザモード状態が関連しているかを説明できますか?これは、キャッシュなどの状態がソケット関数が非ソケット関数とどのように対話するかに影響する可能性があるため、重要です。 –

+0

@Seven、Winsock 2は "階層化サービスプロバイダ"アーキテクチャを採用しているため、Winsockはハンドルからプロバイダへのマッピングを維持します。各プロバイダは追加の状態を保持することができます。どのような追加の状態(実装されているか)が実装の詳細です。おそらくLSPは送信または受信データをキャッシュ/バッファしません。これは、ソケットハンドルでReadFileまたはWriteFileを使用するアプリケーションとの互換性が損なわれるためです。 – John

-1

socket() とopen()の戻り値はWindowsでも同じですか?

Windowsのソケットハンドルは、ファイルシステムの一部ではないWINSOCKサブシステムによって割り当てられます。

+0

これまでのところ、これまでのところ真実でしたが、Windows NTのソケットハンドルは完全なカーネルオブジェクトになりました。ユーザーモードの状態はまだありますが、ユーザーモードDLLとして実装されていません。 –

関連する問題