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
);

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

ソケット sQOS 構造体へのポインター。

[in] lpGQOS

ソケット グループで将来使用するために予約されています。 ソケット グループの QOS 構造体へのポインター (該当する場合)。 このパラメーターは NULL にする必要があります。

戻り値

エラーが発生しない場合、 WSAConnect はゼロを返します。 それ以外の場合はSOCKET_ERRORを返し、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。 ブロッキング ソケットでは、戻り値は接続試行の成功または失敗を示します。

非ブロッキング ソケットでは、接続の試行をすぐに完了することはできません。 この場合、 WSAConnect はSOCKET_ERRORを返し、 WSAGetLastErrorWSAEWOULDBLOCK を返します。そのため、アプリケーションは次の可能性があります。

  • select を使用して、ソケットが書き込み可能かどうかを確認して、接続要求の完了を確認します。
  • アプリケーションで WSAAsyncSelect を使用して接続イベントへの関心を示している場合、接続操作が完了した (成功したかどうか) と、アプリケーションはFD_CONNECT通知を受け取ります。
  • アプリケーションで WSAEventSelect を使用して接続イベントへの関心を示している場合、接続操作が完了すると (成功したかどうかに関係なく) 関連付けられたイベント オブジェクトが通知されます。
非ブロッキング ソケットの場合、接続の試行が完了するまで、同じソケット上の WSAConnect への後続のすべての呼び出しは、エラー コード WSAEALREADY で失敗します。

戻りエラー コードが接続の試行に失敗したことを示す場合 (つまり、 WSAECONNREFUSEDWSAENETUNREACHWSAETIMEDOUT)、アプリケーションは同じソケットに対して WSAConnect を再度呼び出すことができます。

エラー コード 説明
WSANOTINITIALIZED
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEADDRINUSE
ソケットのローカル アドレスは既に使用されており、SO_REUSEADDRでアドレスを再利用できるようにソケットがマークされていませんでした。 このエラーは通常、 バインドの実行中に発生しますが、 バインド 関数が部分的にワイルドカード アドレス (ADDR_ANYを含む) で動作し、この関数の時点で特定のアドレスを "コミット" する必要がある場合は、この関数まで遅延する可能性があります。
WSAEINTR
ソケット 1.1 呼び出しWindows (ブロック) は、WSACancelBlockingCall によって取り消されました。
WSAEINPROGRESS
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEALREADY
指定したソケットで非ブロッキング 接続 または WSAConnect 呼び出しが進行中です。
WSAEADDRNOTAVAIL
リモート アドレスが有効なアドレス (ADDR_ANY など) ではありません。
WSAEAFNOSUPPORT
指定されたファミリ内のアドレスは、このソケットでは使用できません。
WSAECONNREFUSED
接続の試行が拒否されました。
WSAEFAULT
name パラメーターまたは namelen パラメーターがユーザー アドレス空間の有効な部分ではない、namelen パラメーターが小さすぎる、lpCalleeDatalpSQOSおよび lpGQOS のバッファー長が小さすぎる、または lpCallerData のバッファー長が大きすぎる。
WSAEINVAL
パラメーター s がリッスン ソケットであるか、指定された宛先アドレスが、ソケットが属する制約付きグループのアドレスと一致しないか、 lpGQOS パラメーターが NULL ではありません。
WSAEISCONN
ソケットは既に接続されています (接続指向ソケットのみ)。
WSAENETUNREACH
現時点では、このホストからネットワークにアクセスできません。
WSAEHOSTUNREACH
到達できないホストに対してソケット操作が試行されました。
WSAENOBUFS
使用できるバッファー領域はありません。 ソケットを接続できません。
WSAENOTSOCK
記述子はソケットではありません。
WSAEOPNOTSUPP
lpSQOS および lpGQOS で指定された FLOWSPEC 構造体を満たすことはできません。
WSAEPROTONOSUPPORT
lpCallerData パラメーターは、サービス プロバイダーではサポートされていません。
WSAETIMEDOUT
接続を確立せずに、タイムアウトした接続を試みます。
WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、接続をすぐに完了することはできません。
WSAEACCES
setsockopt SO_BROADCASTが有効になっていないため、データグラム ソケットをブロードキャスト アドレスに接続できませんでした。

注釈

WSAConnect 関数は、指定された宛先への接続を作成し、接続時に発生する他の多くの補助操作を実行するために使用されます。 ソケット s がバインドされていない場合は、システムによってローカルの関連付けに一意の値が割り当てられ、ソケットはバインド済みとしてマークされます。

Windows Vista以降を対象とするアプリケーションの場合は、クライアント アプリケーションの設計を大幅に簡略化する WSAConnectByList または WSAConnectByName 関数の使用を検討してください。

接続指向ソケット (SOCK_STREAM 型など) の場合、アクティブな接続は 、名前 (ソケットの名前空間内のアドレス) を使用して外部ホストに対して開始されます。詳細な説明については、 バインドを参照してください。 この呼び出しが正常に完了すると、ソケットはデータを送受信する準備が整います。 名前構造体のアドレス パラメーターがすべてゼロの場合、WSAConnect はエラー WSAEADDRNOTAVAIL を返します。 アクティブな接続を再接続しようとすると、エラー コード WSAEISCONN で失敗します。

手記 ソケットが開かれた場合、 setsockopt 呼び出しが行われ、 sendto 呼び出しが行われると、Windows ソケットは暗黙的な バインド 関数呼び出しを実行します。
 
接続指向の非ブロッキング ソケットの場合、多くの場合、すぐに接続を完了することはできません。 このような場合、この関数はエラー WSAEWOULDBLOCK を返します。 ただし、操作は続行されます。 成功または失敗の結果が判明すると、クライアントが通知に登録する方法に応じて、いくつかの方法のいずれかで報告される場合があります。 クライアントが select を使用している場合、 writefds セットで成功が報告され、 exceptfds セットでエラーが報告されます。 クライアントが WSAAsyncSelect または WSAEventSelect を使用している場合、通知はFD_CONNECTと共に通知され、FD_CONNECTに関連付けられているエラー コードは成功または失敗の特定の理由を示します。

コネクションレス ソケット (たとえば、SOCK_DGRAM 型) の場合、 WSAConnect によって実行される操作は、後続の接続指向の送受信操作 (送信WSASendrecvWSARecv) でソケットを使用できるように、既定の宛先アドレスを確立することだけです。 指定された宛先アドレス以外のアドレスから受信したデータグラムはすべて破棄されます。 名前構造全体が (名前構造のアドレス パラメーターだけでなく) すべてゼロの場合、ソケットは切断されます。 その後、既定のリモート アドレスは不確定になるため、 sendWSASendrecvWSARecv の呼び出しはエラー コード WSAENOTCONN を返します。 ただし、 sendtoWSASendTorecvfromWSARecvFrom は 引き続き使用できます。 ソケットが既に接続されている場合でも、 WSAConnect をもう一度呼び出すだけで、既定の宛先を変更できます。 前の WSAConnect名前が異なる場合、受信キューに格納されたデータグラムはすべて破棄されます。

コネクションレス ソケットの場合、 名前 はブロードキャスト アドレスを含む任意の有効なアドレスを示すことができます。 ただし、ブロードキャスト アドレスに接続するには、ソケットで setsockopt SO_BROADCAST有効になっている必要があります。 それ以外の場合、 WSAConnect はエラー コード WSAEACCES で失敗します。

コネクションレス ソケットでは、ユーザー間データの交換はできず、対応するパラメーターは暗黙的に無視されます。

アプリケーションは、指定したパラメーターによって直接または間接的に指されるメモリ領域を割り当てる役割を担います。

lpCallerData パラメーターには、接続要求と共に送信されるすべてのユーザー データへのポインター (接続データと呼ばれます) が含まれます。 これは、通常のネットワーク データ ストリームではなく、接続を確立するためにネットワーク要求と共に送信される追加のデータです。 このオプションは、DECNet、OSI TP4 などのレガシ プロトコルで使用されます。

Note 接続データは、Windowsの TCP/IP プロトコルではサポートされていません。 接続データは、RAW ソケット経由の ATM (RAWWAN) でのみサポートされます。

 

lpCallerDataNULL の場合、ユーザー データはピアに渡されません。 lpCalleeData は、WSABUF 構造体の接続確立の一部として他のソケットから返されるユーザー データを格納する結果パラメーターです。 lpCalleeData パラメーターが指す WSABUF 構造体の len メンバーには、最初に、WSABUF 構造体の buf メンバーに対してアプリケーションによって割り当てられたバッファーの長さが含まれています。 lpCalleeData パラメーターが指す WSABUF 構造体の len メンバーは、ユーザー・データが戻されていない場合はゼロに設定されます。 lpCalleeData 情報は、接続操作が完了したときに有効になります。 ソケットをブロックする場合、 WSAConnect 関数が戻ったときに接続操作が完了します。 非ブロッキング ソケットの場合、完了はFD_CONNECT通知が発生した後になります。 lpCalleeDataNULL の場合、ユーザー データは返されません。 ユーザー データの正確な形式は、ソケットが属するアドレス ファミリに固有です。

接続時に、アプリケーションは lpSQOS および lpGQOS パラメーターを使用して、 WSAIoctl を介してソケットに対して行われた以前のサービス品質仕様を、SIO_SET_QOSまたはSIO_SET_GROUP_QOSオペコードでオーバーライドできます。

lpSQOS パラメーターは、ソケット sFLOWSPEC 構造体を、各方向に 1 つずつ指定し、その後にプロバイダー固有の追加パラメーターを指定します。 一般的に関連付けられているトランスポート プロバイダーまたは特に特定の種類のソケットがサービスの品質要求を受け入れることができない場合は、次に示すようにエラーが返されます。 送信側または受信フローの仕様値は、一方向ソケットの場合、それぞれ無視されます。 プロバイダー固有のパラメーターが指定されていない場合は、lpCalleeData パラメーターが指す WSABUF 構造体の buf メンバーと len メンバーをそれぞれ NULL と 0 に設定する必要があります。 lpSQOS パラメーターの NULL 値は、アプリケーションが提供するサービス品質がないことを示します。

ソケット グループ lpGQOS で将来使用するために予約されている場合は、ソケット グループの FLOWSPEC 構造体 (該当する場合)、各方向に 1 つ、その後にプロバイダー固有の追加パラメーターを指定します。 プロバイダー固有のパラメーターが指定されていない場合は、lpCalleeData パラメーターが指す WSABUF 構造体の buf メンバーと len メンバーをそれぞれ NULL と 0 に設定する必要があります。 lpGQOSNULL 値は、アプリケーションが提供するグループのサービス品質がないことを示します。 s がソケット グループの作成者でない場合、このパラメーターは無視されます。

接続されているソケットが何らかの理由で閉じられた場合は、破棄して再作成する必要があります。 接続されたソケットで何らかの理由で問題が発生した場合、アプリケーションは、安定したポイントに戻るために、必要なソケットを破棄して再作成する必要があると想定するのが最も安全です。

メモWSAConnect などのブロッキング Winsock 呼び出しを発行する場合、Winsock は、呼び出しを完了する前にネットワーク イベントを待機する必要がある場合があります。 Winsock は、この状況でアラート可能な待機を実行します。この待機は、同じスレッドでスケジュールされた非同期プロシージャ 呼び出し (APC) によって中断される可能性があります。 同じスレッドで進行中の Winsock 呼び出しを中断した別のブロック Winsock 呼び出しを APC 内で発行すると、未定義の動作が発生し、Winsock クライアントが試行してはなりません。
 
Windows Phone 8: この関数は、Windows Phone 8 以降の Windows Phone ストア アプリでサポートされています。

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

こちらも参照ください

WSAAsyncSelect

WSABUF

WSAConnect

ConnectEx

WSAConnectByList

WSAEventSelect

Winsock 関数

Winsock リファレンス

accept

バインド

connect

getsockname

getsockopt

選択

ソケット