ソケット データ型

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 に移植する

Winsock プログラミングに関する考慮事項