Important
最新の Winsock のベスト プラクティス - 新しいコードについては、次のガイドラインに従ってください。
-
Winsock 2.2 を使用します 。 WSAStartup では常にバージョン 2.2 を要求します。
gethostbynameなどの Winsock 1.1 関数は非推奨となり、IPv6 のサポートがありません。 -
名前解決には
getaddrinfoを使用 します。 getaddrinfo 関数はプロトコルに依存しません (IPv4 と IPv6 の両方をサポートします)。 非推奨のgethostbynameやgethostbyaddrは使用しないでください。 -
IPv6 対応のコードを記述する -
AF_UNSPECでgetaddrinfoを使用して、コードが IPv4 と IPv6 の両方で動作するようにします。 ハード コーディングAF_INETは避けてください。 Winsock の IPv6 ガイドを参照してください。 -
RAII で初期化を管理する — C++ では、
WSAStartup/WSACleanupを RAII クラスでラップするか、スコープガードを使用して、すべての終了経路(例外、早期リターン)でクリーンアップが行われるようにします。 - 非同期 I/O を優先 します。サーバー アプリケーションや複数の接続を処理する場合は、 I/O 完了ポート (最高パフォーマンス) または重複 I/O を使用します。 UI スレッドでソケットをブロックすると、アプリケーションがフリーズします。
- エラー処理を忘れないでください 。 すべての Winsock 呼び出しの戻り値を確認し、 WSAGetLastError を使用して診断を行います。
AI によって生成されるコードの一般的な間違い: ソケット呼び出しの前にWSAStartupを忘れる、gethostbynameではなくgetaddrinfoを使用する、AF_INETをハードコーディングする (IPv4 のみ)、UI スレッドでブロックrecv/sendループを使用する、freeaddrinfo後にgetaddrinfoを呼び出さない、
このセクションは、Windows Sockets プログラミングの概要に関するステップ バイ ステップ ガイドです。 これは、基本的な Winsock 関数とデータ構造、およびそれらがどのように連携するかを理解できるように設計されています。
このトピックで説明するために使用するクライアントおよびサーバー アプリケーションは、非常に基本的なクライアントとサーバーです。 Microsoft Windows ソフトウェア開発キット (SDK) に含まれるサンプルには、より高度なコード例が含まれています。
最初のいくつかの手順は、クライアント アプリケーションとサーバー アプリケーションの両方で同じです。
次の記事では、Winsock クライアント アプリケーションを作成するための残りの手順について説明します。
次の記事では、Winsock サーバー アプリケーションを作成するための残りの手順について説明します。
これらの基本的な例の完全なソース コード。
Advanced Winsock サンプル アプリ
GitHubでは、より高度な Winsock クライアントとサーバーのサンプル アプリがいくつか用意されています。 これらは、パフォーマンスの向上から低い順にここに記載されており、次のディレクトリにあります。
iocp
このフォルダーには、I/O 完了ポートを使用する 3 つのサンプル プログラムが含まれています。 プログラムには、
iocpserver関数を使用する Winsock サーバー、、iocpserverex関数を使用する Winsock サーバー、、およびこれらのサーバーのいずれかをテストするために使用される単純なマルチスレッド Winsock クライアントiocpclientが含まれます。サーバー プログラムは、TCP/IP を使用して接続し、サーバーがクライアントにエコー バックする任意のサイズのデータ バッファーを送信することで、複数のクライアントをサポートします。 便宜上、単純なクライアント プログラムである
iocpclientは、複数のスレッドを使用してサーバーに接続し、継続的にデータを送信して負荷を高めるために開発されました。 I/O 完了ポートを使用する Winsock サーバーは、最高のパフォーマンスを提供します。重複する
このフォルダーには、重複した I/O を使用するサンプル サーバー プログラムが含まれています。 サンプル プログラムでは 、AcceptEx 関数と重複 I/O を使用して、クライアントからの複数の非同期接続要求を効果的に処理します。 サーバーは AcceptEx 関数を使用して、シングル スレッド Win32 アプリケーションで異なるクライアント接続を多重化します。 重複した I/O を使用すると、スケーラビリティが向上します。
WSAPoll
このフォルダーには、 WSAPoll 関数の使用方法を示す基本的なサンプル プログラムが含まれています。 クライアントとサーバーの組み合わせプログラムは非ブロッキングであり、 WSAPoll 関数を使用して、ブロックなしで送受信できるタイミングを判断します。 このサンプルは説明を目的としており、高パフォーマンスサーバーではありません。
simple
このフォルダーには、サーバーによる複数のスレッドの使用を示す 3 つの基本的なサンプル プログラムが含まれています。 プログラムには、単純な TCP/UDP サーバー、
simples、Win32 コンソール アプリケーションのsimples_ioctl関数を使用して複数のクライアント要求をサポートする TCP 専用サーバー、、サーバーをテストするためのクライアント TCP/UDP プログラムsimplecが含まれます。 サーバーは、複数のクライアント要求を処理するために複数のスレッドを使用する方法を示しています。 クライアント要求ごとに個別のスレッドが作成されるため、このメソッドにはスケーラビリティの問題があります。承認する
このフォルダーには、基本的なサンプル サーバーとクライアント プログラムが含まれています。 サーバーは、 select 関数を使用した非ブロッキング受け入れ、または WSAAsyncSelect 関数を使用した非同期受け入れの使用を示します。 このサンプルは説明を目的としており、高パフォーマンスサーバーではありません。