Winsock アプリケーションでは、ソケット記述子はファイル記述子ではなく、Winsock 関数で使用する必要があります。
UNIX では、ソケット記述子は標準ファイル記述子によって表されます。 その結果、UNIX 上のソケット記述子は、標準ファイル I/O 関数 (読み取りと書き込みなど) のいずれかに渡すことができます。
さらに、UNIX のすべてのハンドル (ソケット ハンドルを含む) は小さい負でない整数であり、一部のアプリケーションではこれが当てはまることを前提とします。
Windows ソケット ハンドルには制限はなく、INVALID_SOCKET値が有効なソケットではないことを除きます。 ソケット ハンドルは、0 ~ INVALID_SOCKET - 1 の範囲の任意の値を受け取ることができます。
SOCKET 型は符号なしであるため、たとえば UNIX 環境から既存のソース コードをコンパイルすると、符号付き/符号なしデータ型の不一致に関するコンパイラ警告が発生する可能性があります。
つまり、たとえば、ソケット および 関数が戻り値を受け入れたときにエラーをチェックすることは、戻り値を -1 と比較したり、値が負であるかどうかを確認したりして行うべきではありません (UNIX では一般的なアプローチと法的アプローチの両方)。 代わりに、アプリケーションでは、Winsock2.h ヘッダー ファイルで定義されているマニフェスト定数INVALID_SOCKETを使用する必要があります。 例えば:
一般的な BSD UNIX スタイル
s = socket(...);
if (s == -1) /* or s < 0 */
{/*...*/}
優先スタイル
s = socket(...);
if (s == INVALID_SOCKET)
{/*...*/}
関連トピック
-
ソケット アプリケーションを Winsock に移植する