connect

connect関数は指定されたソケットへのコネクションを確立します。

int connect(
    SOCKET                 s,
    const struct sockaddr *name,
    int                    namelen
);

WS2_32.DLL

引数

s

未接続のソケットを識別するディスクリプタを指定します。

name

コネクションが確立されるsockaddr構造体へのアドレスを指定します。

namelen

nameパラメータが指すsockaddr構造体の長さをバイト単位で指定します。

戻り値

成功すると0を返します。

失敗すると-1 (SOCKET_ERROR) を返します。特定のエラーコードを取得するにはWSAGetLastError関数を呼び出します。

ブロッキングソケットでは、戻り値は接続試行が成功または失敗したことを示します。

非ブロッキングソケットを使用した場合、接続試行は直ちに完了しない可能性があります。この場合、connectSOCKET_ERRORを返し、WSAGetLastErrorWSAEWOULDBLOCKを返します。この場合、3つのケースが考えられます。

非ブロッキングソケットにおける接続の確立が完了するまで、同一のソケットに対してconnect以降のすべての呼び出しはエラーコードWSAEALREADYで、また、接続が正常に完了した場合はエラーコードWSAEISCONNで失敗します。Windows Sockets 1.1仕様のあいまいさのため、接続が未解決の間にconnectから返されるエラーコードは実装間で異なる可能性があります。そのため、アプリケーションがconnectの複数回の呼び出しを使用して接続の完了を検出することは推奨されません。そのようなことを行う場合は、アプリケーションは、堅牢な実行を保証するために、WSAEALREADYエラー値を処理する場合と同じ方法でWSAEINVALおよびWSAEWOULDBLOCKエラー値を処理する準備ができていなければなりません。

10004 (WSAEINTR)

ブロッキングWindows Sockets 1.1呼び出しがWSACancelBlockingCallを通じてキャンセルされました

10013 (WSAEACCES)

setsockoptオプションSO_BROADCASTが有効でないため、ダイアグラムソケットのブロードキャストアドレスへの接続試行が失敗しました。

10014 (WSAEFAULT)

nameパラメータが指すsockaddr構造体は関連するアドレスファミリにとって不正なアドレスフォーマットを含んでいるか、namelenパラメータの値が小さすぎます。nameパラメータによって参照されnamelenパラメータで指定された長さを持つsockaddr構造体がユーザアドレス空間の有効な領域にない場合にもこのエラーが返されます。

10022 (WSAEINVAL)

パラメータsはリスニングソケットです。

10035 (WSAEWOULDBLOCK)

そのソケットは非ブロッキングとしてマークされており、接続が直ちに完了しませんでした。

10036 (WSAEINPROGRESS)

ブロッキングWindows Sockets 1.1呼び出しが実行中であるか、サービスプロバイダがコールバック関数を実行中です。

10037 (WSAEALREADY)

非ブロッキングconnect呼び出しが指定されたソケットで実行中です。

Note:下位互換性を維持するため、Winsock.dllまたはWsock32.dllのいずれかにリンクしているWindows Sockets 1.1アプリケーションでは、このエラーはWSAEINVALとして報告されます。

10038 (WSAENOTSOCK)

sパラメータで指定されたディスクリプタはソケットではありません。

10047 (WSAEAFNOSUPPORT)

指定されたファミリのアドレスをこのソケットで使用することはできません。

10048 (WSAEADDRINUSE)

ソケットのローカルアドレスが既に使用されており、ソケットがアドレスを再利用可能となるようにSO_REUSEADDRソケットオプションが付けられていません。このエラーは通常bind関数を実行している際に発生しますが、bindが部分的なワイルドカードアドレス(ADDR_ANYを含む)を指定し、かつ、特定のアドレスがこの関数の時点でコミットされる必要がある場合にこの関数まで先延ばしされる可能性があります。

10049 (WSAEADDRNOTAVAIL)

リモートアドレスが有効ではありません(ADDR_ANYなど)。

10050 (WSAENETDOWN)

ネットワークサブシステムが失敗しました。

10051 (WSAENETUNREACH)

現時点でこのホストからネットワークに到達することができません。

10055 (WSAENOBUFS)

利用可能なバッファ空間がありません。ソケットを接続できません。

10056 (WSAEISCONN)

指定されたソケットはすでに接続されています(コネクション指向のソケットのみ)。

10060 (WSAETIMEDOUT)

接続試行は接続が確立することなくタイムアウトしました。

10061 (WSAECONNREFUSED)

接続の試行が強く拒否されました。

10065 (WSAEHOSTUNREACH)

到達不能なホストに対してソケット操作が試行されました。

10093 (WSANOTINITIALISED)

この関数を呼び出す前にWSAStartup関数の呼び出しが成功していなければなりません。

解説

connect関数は指定された接続先への接続を作成するために使用されます。ソケットsがバインドされていない場合は、システムによってローカルな関連付けに一意の値が割り当てられ、そのソケットはバインドされたものとされます。

コネクション指向のソケット(例えばSOCK_STREAMソケットタイプ)では、name(そのソケットの名前空間にあるアドレス。詳細はbindおよびsockaddrを参照)を使用して、外部のホストへアクティブな接続を開始します。

Note: ソケットをオープンしてsetsockoptを呼び出し、その後にsendtoを呼び出した場合、Windows Socketsは暗黙のうちにbind関数の呼び出しを実行します。

呼び出しが正常に成功すると、ソケットはデータの送受信をすることができる状態になります。nameパラメータで指定された構造体のアドレスのメンバがすべてゼロである場合には、connectはエラーコードWSAEADDRNOTAVAILで失敗します。

コネクション指向の非ブロッキングソケットでは、しばしば接続が直ちに完了しない可能性があります。そのような場合、関数はエラーコードWSAEWOULDBLOCKでエラーを返しますが、接続操作は継続します。

成功または失敗の結果が判明すると、クライアントが通知をどのように登録しているかの応じて、以下の2通りのうちの1つで報告される可能性があります。

非接続型ソケット(例えばSOCK_DGRAMソケットタイプ)では、connectによって実行される操作は、単に後続のsend/WSASend関数およびrecv/WSARecv呼び出しにおけるデフォルトの送受信先アドレスを設定することだけです。指定された送受信先アドレス以外のアドレスから受信したデータグラムはすべて破棄されます。nameパラメータで指定された構造体のアドレスメンバがすべてゼロである場合には、send/WSASend関数およびrecv/WSARecv関数呼び出しはエラーコードWSAENOTCONNで失敗します。ただし、send/WSASend関数およびrecv/WSARecv関数はまだ使用することができます。デフォルトの送受信先は、すでにソケットが接続済みであっても、単にconnect関数を再度呼び出すだけで変更することができます。以前のconnect呼び出し時とnameが異なる場合には、受信用にキューイングされているデータグラムはすべて破棄されます。

非接続型ソケットでは、nameはブロードキャストアドレスを含む任意の有効なアドレスを指定することができます。ただし、ブロードキャストアドレスへ接続するには、ソケットはsetsockoptを使用してSO_BROADCASTオプションを有効にしなければなりません。そうしなければ、connectはエラーコードWSAEACCESで失敗します。

ソケット間の接続が切れた場合は、アプリケーションはソケットを破棄して再作成するべきです。接続されたソケットで問題が発生した場合は、アプリケーションはソケットを破棄し、安定点に戻るために必要なソケットを再作成しなければなりません。

対応情報

Windows 95 以降 / Windows NT 3.1 以降