WSAConnect 関数 (winsock2.h)
WSAConnect 関数は、別のソケット アプリケーションへの接続を確立し、接続データを交換し、指定された FLOWSPEC 構造体に基づいて必要なサービス品質を指定します。
構文
int WSAAPI WSAConnect(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen,
[in] LPWSABUF lpCallerData,
[out] LPWSABUF lpCalleeData,
[in] LPQOS lpSQOS,
[in] LPQOS lpGQOS
);
パラメーター
[in] s
接続されていないソケットを識別する記述子。
[in] name
接続先のアドレスを指定する sockaddr 構造体へのポインター。 IPv4 の場合、 sockaddr には、アドレス ファミリ、宛先 IPv4 アドレス、および宛先ポートの AF_INET が含まれます。 IPv6 の場合、 sockaddr 構造体には、アドレス ファミリの AF_INET6 、宛先 IPv6 アドレス、宛先ポート、および追加のフローとスコープ ID 情報が含まれる場合があります。
[in] namelen
name パラメーターが指す sockaddr 構造体の長さ (バイト単位)。
[in] lpCallerData
接続の確立中に他のソケットに転送されるユーザー データへのポインター。 「解説」を参照してください。
[out] lpCalleeData
接続の確立中に他のソケットから転送されるユーザー データへのポインター。 「解説」を参照してください。
[in] lpSQOS
ソケット s の FLOWSPEC 構造体へのポインター。方向ごとに 1 つ。
[in] lpGQOS
ソケット グループで今後使用するために予約されています。 ソケット グループの FLOWSPEC 構造体へのポインター (該当する場合)。 このパラメーターは NULL にする必要があります。
戻り値
エラーが発生しない場合、 WSAConnect は 0 を返します。 それ以外の場合はSOCKET_ERRORを返し、 WSAGetLastError を呼び出すことで特定のエラー コードを取得できます。 ブロッキング ソケットでは、戻り値は接続試行の成功または失敗を示します。
非ブロッキング ソケットでは、接続の試行をすぐに完了することはできません。 この場合、 WSAConnect はSOCKET_ERRORを返し、 WSAGetLastError は WSAEWOULDBLOCK を返します。そのため、アプリケーションは次の可能性があります。
- select を使用して、ソケットが書き込み可能かどうかを確認して、接続要求の完了を確認します。
- アプリケーションで WSAAsyncSelect を使用して接続イベントへの関心を示している場合、接続操作が完了した (成功したかどうか) と、アプリケーションはFD_CONNECT通知を受け取ります。
- アプリケーションが WSAEventSelect を使用して接続イベントに関心があることを示している場合、接続操作が完了すると (成功した場合は、そうでない場合)、関連付けられたイベント オブジェクトが通知されます。
戻りエラー コードが接続試行に失敗したことを示す場合 (つまり、 WSAECONNREFUSED、 WSAENETUNREACH、 WSAETIMEDOUT) アプリケーションは、同じソケットに対して WSAConnect を再度呼び出すことができます。
エラー コード | 意味 |
---|---|
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。 | |
ネットワーク サブシステムが失敗しました。 | |
ソケットのローカル アドレスは既に使用されており、SO_REUSEADDRでアドレスを再利用できるようにソケットがマークされていません。 このエラーは通常、 バインドの実行中に発生しますが、 バインド 関数が部分的なワイルドカード アドレス (ADDR_ANYを含む) で動作し、この関数の時点で特定のアドレスを "コミット" する必要がある場合は、この関数まで遅延する可能性があります。 | |
(ブロッキング) Windows Socket 1.1 呼び出しは 、WSACancelBlockingCall を介して取り消されました。 | |
ブロックしている Windows Sockets 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 | |
指定したソケットで非ブロッキング 接続 または WSAConnect 呼び出しが進行中です。 | |
リモート アドレスが有効なアドレス (ADDR_ANY など) ではありません。 | |
指定されたファミリーのアドレスをこのソケットと共に使用することはできません。 | |
接続の試行が拒否されました。 | |
name または namelen パラメーターがユーザー アドレス空間の有効な部分ではない、namelen パラメーターが小さすぎる、lpCalleeData、lpSQOS、lpGQOS のバッファー長が小さすぎる、または lpCallerData のバッファー長が大きすぎる。 | |
パラメーター s がリッスン ソケットであるか、指定された宛先アドレスが、ソケットが属する制約付きグループのアドレスと一致しないか、 lpGQOS パラメーターが NULL ではありません。 | |
ソケットは既に接続されています (接続指向ソケットのみ)。 | |
現在このホストからネットワークには到達できません。 | |
到達できないホストに対してソケット操作を実行しようとしました。 | |
バッファーに空き領域がありません。 ソケットを接続できません。 | |
記述子はソケットではありません。 | |
lpSQOS および lpGQOS で指定された FLOWSPEC 構造体を満たすことはできません。 | |
lpCallerData パラメーターは、サービス プロバイダーではサポートされていません。 | |
接続を確立せずに、接続がタイムアウトしました。 | |
ソケットは非ブロッキングとしてマークされ、接続をすぐに完了することはできません。 | |
setsockopt SO_BROADCASTが有効になっていないため、データグラム ソケットをブロードキャスト アドレスに接続できませんでした。 |
注釈
WSAConnect 関数は、指定した宛先への接続を作成し、接続時に発生する他の多くの補助操作を実行するために使用されます。 ソケット s が非連結の場合、一意の値はシステムによってローカル関連付けに割り当てられ、ソケットはバインド済みとしてマークされます。
Windows Vista 以降を対象とするアプリケーションの場合は、クライアント アプリケーションの設計を大幅に簡略化する WSAConnectByList または WSAConnectByName 関数の使用を検討してください。
接続指向ソケット (例: SOCK_STREAM) の場合、アクティブな接続は 、名前 を使用して外部ホストに対して開始されます (ソケットの名前空間内のアドレス。詳細な説明については、「 bind」を参照してください)。 この呼び出しが正常に完了すると、ソケットはデータを送受信する準備が整います。 名前構造体の address パラメーターがすべてゼロの場合、WSAConnect はエラー WSAEADDRNOTAVAIL を返します。 アクティブな接続を再接続しようとすると、エラー コード WSAEISCONN で失敗します。
コネクションレス ソケット (例: SOCK_DGRAM) の場合、 WSAConnect によって実行される操作は、後続の接続指向の送受信操作 (送信、 WSASend、 recv、 WSARecv) でソケットを使用できるように、既定の宛先アドレスを確立することだけです。 指定された宛先アドレス以外のアドレスから受信したデータグラムはすべて破棄されます。 名前構造全体が (名前構造体のアドレス パラメーターだけでなく) すべて 0 の場合、ソケットは切断されます。 その後、既定のリモート アドレスは不確定になるため、 send、 WSASend、 recv、 および WSARecv 呼び出しはエラー コード WSAENOTCONN を返します。 ただし、 sendto、 WSASendTo、 recvfrom、 および WSARecvFrom は 引き続き使用できます。 ソケットが既に接続されている場合でも、 WSAConnect をもう一度呼び出すだけで、既定の宛先を変更できます。 前の WSAConnect と名前が異なる場合、受信待ち行列に入っているデータグラムはすべて破棄されます。
コネクションレス ソケットの場合、 名前 はブロードキャスト アドレスを含む任意の有効なアドレスを示すことができます。 ただし、ブロードキャスト アドレスに接続するには、ソケットで setsockopt SO_BROADCASTが有効になっている必要があります。 それ以外の場合、 WSAConnect はエラー コード WSAEACCES で失敗します。
コネクションレス ソケットでは、ユーザー間データの交換は不可能であり、対応するパラメーターは暗黙的に無視されます。
アプリケーションは、指定されたパラメーターのいずれかによって直接または間接的に指されるメモリ領域を割り当てる役割を担います。
lpCallerData パラメーターには、接続要求 (接続データと呼ばれる) と共に送信されるユーザー データへのポインターが含まれています。 これは、通常のネットワーク データ ストリーム内ではなく、接続を確立するためのネットワーク要求と共に送信される追加データです。 このオプションは、DECNet、OSI TP4 などのレガシ プロトコルで使用されます。
lpCallerData が NULL の場合、ユーザー データはピアに渡されません。 lpCalleeData は、WSABUF 構造体の接続確立の一部として他のソケットから返されるユーザー データを格納する結果パラメーターです。 lpCalleeData パラメーターが指す WSABUF 構造体の len メンバーには、WSABUF 構造体の buf メンバーに対してアプリケーションによって割り当てられたバッファーの長さが最初に含まれています。 lpCalleeData パラメーターが指す WSABUF 構造体の len メンバーは、ユーザー データが返されない場合は 0 に設定されます。 lpCalleeData 情報は、接続操作が完了したときに有効になります。 ソケットをブロックする場合、 WSAConnect 関数が戻ったときに接続操作が完了します。 非ブロッキング ソケットの場合、完了は、FD_CONNECT通知が発生した後になります。 lpCalleeData が NULL の場合、ユーザー データは返されません。 ユーザー データの正確な形式は、ソケットが属するアドレス ファミリに固有です。
接続時に、アプリケーションは lpSQOS パラメーターと lpGQOS パラメーターを使用して、 WSAIoctl を介してソケットに対して行われた以前のサービス品質仕様を、SIO_SET_QOSまたはSIO_SET_GROUP_QOSオペコードでオーバーライドできます。
lpSQOS パラメーターは、ソケット s の FLOWSPEC 構造体を、各方向に 1 つずつ指定し、その後にプロバイダー固有の追加パラメーターを指定します。 関連付けられているトランスポート プロバイダーが一般的であるか、特に特定の種類のソケットがサービスの品質要求を受け入れることができない場合は、次に示すようにエラーが返されます。 送信側または受信側のフロー仕様値は、一方向ソケットの場合は、それぞれ無視されます。 プロバイダー固有のパラメーターが指定されていない場合は、lpCalleeData パラメーターが指す WSABUF 構造体の buf メンバーと len メンバーをそれぞれ NULL と 0 に設定する必要があります。 lpSQOS パラメーターの NULL 値は、アプリケーションが提供するサービス品質がないことを示します。
ソケット グループ lpGQOS で将来使用するために予約されています。ソケット グループの FLOWSPEC 構造体 (該当する場合)、各方向に 1 つ、その後にプロバイダー固有の追加パラメーターを指定します。 プロバイダー固有のパラメーターが指定されていない場合は、lpCalleeData パラメーターが指す WSABUF 構造体の buf メンバーと len メンバーをそれぞれ NULL と 0 に設定する必要があります。 lpGQOS の NULL 値は、アプリケーションが提供するグループのサービス品質がないことを示します。 s がソケット グループの作成者でない場合、このパラメーターは無視されます。
接続されたソケットが何らかの理由で閉じられた場合は、破棄して再作成する必要があります。 接続されたソケットで何らかの理由で問題が発生した場合、アプリケーションは必要なソケットを破棄して再作成して安定したポイントに戻る必要があると想定するのが最も安全です。
Windows 8.1とWindows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 8.1、 Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | winsock2.h |
Library | Ws2_32.lib |
[DLL] | Ws2_32.dll |