connect 関数 (winsock2.h)

connect 関数は、指定されたソケットへの接続を確立します。

構文

int WSAAPI connect(
  [in] SOCKET         s,
  [in] const sockaddr *name,
  [in] int            namelen
);

パラメーター

[in] s

接続されていないソケットを識別する記述子。

[in] name

接続を確立する必要がある sockaddr 構造体へのポインター。

[in] namelen

name パラメーターが指す sockaddr 構造体の長さ (バイト単位)。

戻り値

エラーが発生しない場合、 connect は 0 を返します。 それ以外の場合は、SOCKET_ERRORが返され、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。

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

非ブロッキング ソケットでは、接続の試行をすぐに完了することはできません。 この場合、 connect はSOCKET_ERRORを返し、 WSAGetLastErrorWSAEWOULDBLOCK を返します。 この場合、次の 3 つのシナリオが考えられます。

  • select 関数を使用して、ソケットが書き込み可能かどうかを確認して、接続要求の完了を確認します。
  • アプリケーションが WSAAsyncSelect を使用して接続イベントへの関心を示している場合、アプリケーションは 接続 操作が完了したことを示すFD_CONNECT通知を受け取ります (正常かどうか)。
  • アプリケーションが WSAEventSelect を使用して接続イベントへの関心を示している場合、 接続 操作が完了したことを示す関連イベント オブジェクトが通知されます (正常かどうか)。

非ブロッキング ソケットで接続試行が完了するまで、同じソケットで 接続 する後続のすべての呼び出しは、接続が正常に完了するとエラー コード WSAEALREADYWSAEISCONN で失敗します。 Windows ソケット仕様のバージョン 1.1 のあいまいさにより、接続が既に保留中の間に 接続 から返されるエラー コードは実装によって異なる場合があります。 その結果、アプリケーションで複数の呼び出しを使用して接続の完了を検出することはお勧めしません。 その場合は、 WSAEINVAL エラー値と WSAEWOULDBLOCK エラー値を WSAEALREADY を処理するのと同じ方法で処理するように準備して、堅牢な操作を保証する必要があります。

返されるエラー コードが、接続の試行が失敗したことを示す場合 (つまり、 WSAECONNREFUSEDWSAENETUNREACHWSAETIMEDOUT) 同じソケットに対して再度 接続 を呼び出すことができます。

エラー コード 意味
WSANOTINITIALISED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEADDRINUSE
ソケットのローカル アドレスは既に使用されており、ソケットはSO_REUSEADDRでのアドレスの再利用を許可するようにマークされていませんでした。 このエラーは通常、バインドの実行時に発生しますが、バインドがローカル IP アドレスのワイルドカード アドレス (INADDR_ANYまたはin6addr_any) にバインドされた場合接続関数まで遅延する可能性があります。 特定のアドレスは、 接続 関数によって暗黙的にバインドされる必要があります。
WSAEINTR
ブロックしている Windows ソケット 1.1 呼び出しは 、WSACancelBlockingCall を通じて取り消されました。
WSAEINPROGRESS
ブロックしている Windows Sockets 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEALREADY
指定したソケットで非ブロッキング 接続 呼び出しが進行中です。
メモ 下位互換性を維持するために、このエラーは、Winsock.dllまたはWsock32.dllにリンクする Windows Sockets 1.1 アプリケーションに WSAEINVAL として報告されます。
 
WSAEADDRNOTAVAIL
リモート アドレスが有効なアドレス ( INADDR_ANYin6addr_anyなど) ではありません。
WSAEAFNOSUPPORT
指定されたファミリーのアドレスをこのソケットと共に使用することはできません。
WSAECONNREFUSED
接続要求は強制的に拒否されました。
WSAEFAULT
名前が指す sockaddr 構造体に、関連付けられているアドレス ファミリの不適切なアドレス形式が含まれているか、namelen パラメーターが小さすぎます。 namelen パラメーターで指定された長さの name パラメーターが指す sockaddr 構造体が、ユーザー・アドレス・スペースの有効な部分にない場合にも、このエラーが返されます。
WSAEINVAL
パラメーター s はリッスン ソケットです。
WSAEISCONN
ソケットは既に接続されています (接続指向ソケットのみ)。
WSAENETUNREACH
現在このホストからネットワークには到達できません。
WSAEHOSTUNREACH
到達できないホストに対してソケット操作を実行しようとしました。
WSAENOBUFS
メモ バッファー領域は使用できません。 ソケットを接続できません。
 
WSAENOTSOCK
s パラメーターで指定された記述子がソケットではありません。
WSAETIMEDOUT
接続を確立せずに接続しようとするとタイムアウトしました。
WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、接続をすぐに完了することはできません。
WSAEACCES
setsockopt オプション SO_BROADCASTが有効になっていないため、データグラム ソケットをブロードキャスト アドレスに接続できませんでした。

注釈

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

接続指向ソケット (SOCK_STREAM 型など) の場合、アクティブな接続は 、名前 (ソケットの名前空間内のアドレス) を使用して外部ホストに開始されます (詳細な説明については、 bindsockaddr を参照してください)。

メモ ソケットが開かれた場合、 setsockopt 呼び出しが行われ、 sendto 呼び出しが行われると、Windows Sockets は暗黙的な バインド 関数呼び出しを実行します。

 

ソケット呼び出しが正常に完了すると、ソケットはデータを送受信する準備が整います。 name パラメーターで指定された構造体のアドレス・メンバーにゼロが入った場合、connect はエラー WSAEADDRNOTAVAIL を返します。 アクティブな接続を再接続しようとすると、エラー コード WSAEISCONN で失敗します。

接続指向の非ブロッキング ソケットの場合、多くの場合、すぐに接続を完了することはできません。 このような場合、この関数はエラー WSAEWOULDBLOCK を返します。 ただし、操作は続行されます。

成功または失敗の結果が判明すると、クライアントが通知に登録する方法に応じて、2 つの方法のいずれかで報告される場合があります。

  • クライアントが select 関数を使用している場合、writefds セットで成功が報告され、exceptfds セットでエラーが報告されます。
  • クライアントが WSAAsyncSelect または WSAEventSelect 関数を使用している場合、通知はFD_CONNECTと共にアナウンスされ、FD_CONNECTに関連付けられているエラー コードは成功または特定の失敗の理由を示します。

接続がすぐに完了しない場合、クライアントは接続の完了を待ってから 、setsockopt を使用してソケット オプションを設定する必要があります。 接続の進行中に setsockopt を呼び出すことはサポートされていません。

コネクションレス ソケット (たとえば、SOCK_DGRAM 型) の場合、接続によって実行される操作は、WSASend 呼び出しと recv/ WSARecv 呼び出しの後続の送信/ で使用できる既定の宛先アドレスを確立することだけです。 指定された宛先アドレス以外のアドレスから受信したデータグラムは破棄されます。 名前で指定された構造体のアドレス メンバーにゼロが入力されている場合、ソケットは切断されます。 その後、既定のリモート アドレスが不確定になるため、WSASendrecv/ WSARecv 呼び出しを送信/ すると、エラー コード WSAENOTCONN が返されます。 ただし、sendto/ WSASendTo と / wsaRecvFrom は引き続き使用できます。 ソケットが既に 接続 されている場合でも、接続を再度呼び出すだけで、既定の宛先を変更できます。 名前が前の接続と異なる場合、受信待ち行列に入れられているデータグラムはすべて破棄されます。

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

ソケット間の接続が切断された場合は、接続されていたソケットを破棄し、新しいソケットを作成する必要があります。 接続されたソケットで問題が発生した場合、アプリケーションはソケットを破棄し、安定したポイントに戻るためにソケットをもう一度作成する必要があります。

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

コード例

次の例では、 接続 関数の使用方法を示します。
#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")

int wmain()
{
    //----------------------
    // Initialize Winsock
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup function failed with error: %d\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for connecting to server
    SOCKET ConnectSocket;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.
    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientService.sin_port = htons(27015);

    //----------------------
    // Connect to server.
    iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
        iResult = closesocket(ConnectSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    wprintf(L"Connected to server.\n");

    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    WSACleanup();
    return 0;
}


connect 関数を使用する別の例については、「はじめに With Winsock」を参照してください。

IrDA ソケットに関する注意事項

  • Af_irda.h ヘッダー ファイルは明示的に含まれている必要があります。
  • メディア アクセス レベルで既存の IrDA 接続が検出されると、 WSAENETDOWN が返されます。
  • 別のアドレスを持つデバイスへのアクティブな接続が存在する場合は、 WSAEADDRINUSE が返されます。
  • ソケットが既に接続されているか、排他的/多重化モードの変更に失敗した場合は、 WSAEISCONN が返されます。
  • ソケットがバインド を使用して受信接続を受け入れるためにローカル サービス名にバインドされていた場合は、 WSAEINVAL が返されます。 一度バインドされたソケットは、送信接続の確立に使用できないことに注意してください。

IrDA は、フォーム sockaddr_irdaのアドレスを持つ接続関数を実装します。 通常、クライアント アプリケーションはソケット関数を使用してソケットを作成し、IRLMP_ENUMDEVICES ソケット オプションを使用して IrDA デバイスのすぐ近くをスキャンし、返されたリストからデバイスを選択し、アドレスを形成して、 接続を呼び出します。 ブロッキング セマンティクスと非ブロッキング セマンティクスに違いはありません。

要件

   
サポートされている最小のクライアント Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリ |UWP アプリ]
対象プラットフォーム Windows
ヘッダー winsock2.h
Library Ws2_32.lib
[DLL] Ws2_32.dll

こちらもご覧ください

WSAAsyncSelect

WSAConnect

ConnectEx

Winsock 関数

Winsock リファレンス

accept

bind

getsockname

select

Sockaddr

socket