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
);
Parameters
[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 の QOS 構造体へのポインター。
[in] lpGQOS
ソケット グループで将来使用するために予約されています。 ソケット グループの QOS 構造体へのポインター (該当する場合)。 このパラメーターは NULL にする必要があります。
戻り値
エラーが発生しない場合、 WSAConnect はゼロを返します。 それ以外の場合はSOCKET_ERRORを返し、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。 ブロッキング ソケットでは、戻り値は接続試行の成功または失敗を示します。
非ブロッキング ソケットでは、接続の試行をすぐに完了することはできません。 この場合、 WSAConnect はSOCKET_ERRORを返し、 WSAGetLastError は WSAEWOULDBLOCK を返します。そのため、アプリケーションは次の可能性があります。
- select を使用して、ソケットが書き込み可能かどうかを確認して、接続要求の完了を確認します。
- アプリケーションで WSAAsyncSelect を使用して接続イベントへの関心を示している場合、接続操作が完了した (成功したかどうか) と、アプリケーションはFD_CONNECT通知を受け取ります。
- アプリケーションで WSAEventSelect を使用して接続イベントへの関心を示している場合、接続操作が完了すると (成功したかどうかに関係なく) 関連付けられたイベント オブジェクトが通知されます。
戻りエラー コードが接続の試行に失敗したことを示す場合 (つまり、 WSAECONNREFUSED、 WSAENETUNREACH、 WSAETIMEDOUT)、アプリケーションは同じソケットに対して WSAConnect を再度呼び出すことができます。
| エラー コード | 説明 |
|---|---|
| この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。 | |
| ネットワーク サブシステムが失敗しました。 | |
| ソケットのローカル アドレスは既に使用されており、SO_REUSEADDRでアドレスを再利用できるようにソケットがマークされていませんでした。 このエラーは通常、 バインドの実行中に発生しますが、 バインド 関数が部分的にワイルドカード アドレス (ADDR_ANYを含む) で動作し、この関数の時点で特定のアドレスを "コミット" する必要がある場合は、この関数まで遅延する可能性があります。 | |
| ソケット 1.1 呼び出しWindows (ブロック) は、WSACancelBlockingCall によって取り消されました。 | |
| ブロックしている Windows ソケット 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 型など) の場合、アクティブな接続は 、名前 (ソケットの名前空間内のアドレス) を使用して外部ホストに対して開始されます。詳細な説明については、 バインドを参照してください。 この呼び出しが正常に完了すると、ソケットはデータを送受信する準備が整います。 名前構造体のアドレス パラメーターがすべてゼロの場合、WSAConnect はエラー WSAEADDRNOTAVAIL を返します。 アクティブな接続を再接続しようとすると、エラー コード WSAEISCONN で失敗します。
コネクションレス ソケット (たとえば、SOCK_DGRAM 型) の場合、 WSAConnect によって実行される操作は、後続の接続指向の送受信操作 (送信、 WSASend、 recv、 WSARecv) でソケットを使用できるように、既定の宛先アドレスを確立することだけです。 指定された宛先アドレス以外のアドレスから受信したデータグラムはすべて破棄されます。 名前構造全体が (名前構造のアドレス パラメーターだけでなく) すべてゼロの場合、ソケットは切断されます。 その後、既定のリモート アドレスは不確定になるため、 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 メンバーは、ユーザー・データが戻されていない場合はゼロに設定されます。 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 ストア アプリでサポートされています。
Requirements
| Requirement | 価値 |
|---|---|
| サポートされる最小クライアント | Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ] |
| サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリ |UWP アプリ] |
| ターゲット プラットフォーム の | Windows |
| ヘッダー | winsock2.h |
| ライブラリ | Ws2_32.lib |
| DLL | Ws2_32.dll |