LPWSPCONNECT コールバック関数 (ws2spi.h)
LPWSPConnect 関数は、ピアへの接続を確立し、接続データを交換し、指定されたフロー仕様に基づいて必要なサービス品質を指定します。
構文
LPWSPCONNECT Lpwspconnect;
int Lpwspconnect(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen,
[in] LPWSABUF lpCallerData,
[out] LPWSABUF lpCalleeData,
[in] LPQOS lpSQOS,
[in] LPQOS lpGQOS,
[out] LPINT lpErrno
)
{...}
パラメーター
[in] s
接続されていないソケットを識別する記述子。
[in] name
sockaddr 内のソケットが接続されるピアの名前。
[in] namelen
名前の長さ (バイト単位)。
[in] lpCallerData
接続の確立中にピアに転送されるユーザー データへのポインター。
[out] lpCalleeData
接続の確立中にピアから受信したユーザー データをコピーできるバッファーへのポインター。
[in] lpSQOS
ソケット s のフロー仕様へのポインター。各方向に対して 1 つ。
[in] lpGQOS
予約済み。
[out] lpErrno
エラー コードへのポインター。
戻り値
エラーが発生しない場合、 LPWSPConnect は 0 を返します。 それ以外の場合はSOCKET_ERRORを返し、 lpErrno で特定のエラー コードを使用できます。
ブロッキング ソケットでは、戻り値は接続試行の成功または失敗を示します。 戻りエラー コードが接続の試行に失敗したことを示す場合 (つまり、 WSAECONNREFUSED、 WSAENETUNREACH、 WSAETIMEDOUT)、Winsock SPI クライアントは同じソケットに対して LPWSPConnect を再度呼び出すことができます。
エラー コード | 意味 |
---|---|
ネットワーク サブシステムが失敗しました。 | |
ソケットのローカル アドレスは既に使用されており、SO_REUSEADDRでアドレスを再利用できるようにソケットがマークされていません。 このエラーは通常、バインド時に発生しますが、バインドが部分的なワイルドカード アドレス (ADDR_ANYを含む) に対する場合、およびこの関数の時点で特定のアドレスをコミットする必要がある場合は、この関数まで遅延する可能性があります。 | |
(ブロッキング) 呼び出しは LPWSPCancelBlockingCall を介して取り消されました。 | |
Winsock 呼び出しのブロックが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 | |
指定されたソケットで、非ブロッキング LPWSPConnect 呼び出しが進行中です。 下位互換性を維持するために、このエラーは、Winsock.dll または Wsock32.dll のいずれかにリンクする Windows Sockets 1.1 アプリケーションに WSAEINVAL として報告されます。 |
|
リモート アドレスが有効なアドレスではありません (たとえば、ADDR_ANY)。 | |
指定されたファミリーのアドレスをこのソケットと共に使用することはできません。 | |
接続の試行が拒否されました。 | |
name または namelen パラメーターがユーザー アドレス空間の有効な部分ではない、namelen パラメーターが小さすぎる、lpCalleeData、lpSQOS、lpGQOS のバッファー長が小さすぎる、または lpCallerData のバッファー長が大きすぎる。 | |
パラメーター s はリッスン ソケットです。 | |
ソケットは既に接続されています (接続指向のソケットのみ)。 | |
現在このホストからネットワークには到達できません。 | |
バッファーに空き領域がありません。 ソケットを接続できません。 | |
記述子はソケットではありません。 | |
lpSQOS で指定されたフロー仕様を満たすことはできません。 | |
lpCallerData 拡張は、サービス プロバイダーではサポートされていません。 | |
接続を確立せずに接続試行がタイムアウトしました。 | |
ソケットが非ブロッキングとしてマークされ、接続をすぐに完了することはできません。 ** WSPSelect ** 関数を使用して書き込み用に選択することで、接続中に LPWSPSelect 関数を使用してソケットを選択できます。 | |
WSPSetSockOpt SO_BROADCASTが有効になっていないため、データグラム ソケットをブロードキャスト アドレスに接続できませんでした。 |
注釈
この関数は、指定した宛先への接続を作成し、接続時に発生する他の多くの補助操作を実行するためにも使用されます。 ソケット s がバインドされていない場合、一意の値はシステムによってローカル関連付けに割り当てられ、ソケットはバインド済みとしてマークされます。
接続指向ソケットの場合 (たとえば、「SOCK_STREAM」と入力)、 名前 (ソケット の名前空間内のアドレス) を使用して、指定したホストへのアクティブな接続が開始されます。 詳細については、「 LPWSPBind」を参照してください。 この呼び出しが正常に完了すると、ソケットはデータを送受信する準備が整います。 名前構造体のアドレス メンバーがすべてゼロの場合、LPWSPConnect はエラー WSAEADDRNOTAVAIL を返します。 アクティブな接続を再接続しようとすると、エラー コード WSAEISCONN で失敗します。
接続指向の非ブロッキング ソケットの場合、多くの場合、接続をすぐに完了することはできません。 このような場合、この関数はエラー WSAEWOULDBLOCK で を返しますが、操作は続行されます。 成功または失敗の結果が判明すると、クライアントが通知に登録する方法に応じて、いくつかの方法のいずれかで報告される場合があります。 クライアントが LPWSPSelect を使用する場合、 writefds セットで成功が報告され、 exceptfds セットでエラーが報告されます。 クライアントが LPWSPAsyncSelect または LPWSPEventSelect を使用している場合、通知はFD_CONNECTで通知され、FD_CONNECTに関連付けられているエラー コードは成功または特定の失敗の理由を示します。
コネクションレス ソケットの場合 (たとえば、「SOCK_DGRAM」と入力します)、 LPWSPConnect によって実行される操作は、ソケットを後続の接続指向の送受信操作 (LPWSPSend、 LPWSPRecv) で使用できるように、既定の宛先アドレスを確立することです。 指定された宛先アドレス以外のアドレスから受信したデータグラムはすべて破棄されます。 名前構造体のアドレス メンバーがすべてゼロの場合、ソケットは切断されます。既定のリモート アドレスは不確定であるため、LPWSPSend 呼び出しと LPWSPRecv 呼び出しはエラー コード WSAENOTCONN を返します。 ただし、 LPWSPSendTo と LPWSPRecvFrom は引き続き使用できます。 ソケットが既に接続されている場合でも、 LPWSPConnect をもう一度呼び出すだけで、既定の宛先を変更できます。 前の LPWSPConnectと名前が異なる場合、受信待ち行列に入っているデータグラムはすべて破棄されます。
コネクションレス ソケットの場合、 名前 はブロードキャスト アドレスを含む任意の有効なアドレスを示すことができます。 ただし、ブロードキャスト アドレスに接続するには、ソケットで WSPSetSockOpt SO_BROADCAST有効になっている必要があります。 それ以外の場合、 LPWSPConnect はエラー コード WSAEACCES で失敗します。
コネクションレス ソケットでは、ユーザー間データの交換はできず、対応するパラメーターは無視されます。
Winsock SPI クライアントは、指定したパラメーターによって直接または間接的に指されるメモリ領域を割り当てる役割を担います。
lpCallerData は、接続要求と共に送信されるユーザー データを含む値パラメーターです。 lpCallerData が null の場合、ユーザー データはピアに渡されません。 lpCalleeData は、接続確立の一部としてピアから返されたユーザー データを参照する結果パラメーターです。 lpCalleeData-len> には、最初は Winsock SPI クライアントによって割り当てられ、lpCalleeData-buf> によって指されるバッファーの長さが含まれています。 ユーザー データが返されていない場合、lpCalleeData-len> は 0 に設定されます。 lpCalleeData 情報は、接続操作が完了すると有効になります。 ブロッキング ソケットの場合、 これは LPWSPConnect 関数が戻るときに発生します。 非ブロッキング ソケットの場合は、FD_CONNECT通知が発生した後になります。 lpCalleeData が null の場合、ユーザー データは返されません。 ユーザー データの正確な形式は、ソケットが属しているアドレス ファミリまたは関連するアプリケーションに固有です。
接続時に、Winsock SPI クライアントは lpSQOS パラメーターを使用して、 LPWSPIoctl を介してソケットに対して行われた以前の QoS 仕様を、SIO_SET_QOSオペコードでオーバーライドできます。
lpSQOS は、ソケットのフロー仕様を指定します。各方向に 1 つずつ、その後にプロバイダー固有の追加パラメーターが続きます。 関連付けられているトランスポート プロバイダー全般または特定の種類のソケットが特に QoS 要求を受け入れることができない場合は、次に示すようにエラーが返されます。 送信側または受信側のフロー仕様値は、一方向ソケットの場合、それぞれ無視されます。 プロバイダー固有のパラメーターが指定されていない場合は、lpSQOS-ProviderSpecific> の buf メンバーと len メンバーをそれぞれ null と 0 に設定する必要があります。 lpSQOS の null 値は、アプリケーションがサービスの品質を提供しなかったことを示します。
注意
接続されたソケットが切断された場合 (つまり、何らかの理由で閉じられる)、それらは破棄して再作成する必要があります。 接続されているソケットで何らかの理由で問題が発生した場合、Winsock SPI クライアントは、安定したポイントに戻るために必要なソケットを破棄して再作成する必要があると想定するのが最も安全です。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
Header | ws2spi.h |