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) アプリケーションは、同じソケットに対してもう一度 connect を呼び出すことができます。

エラー コード 意味
WSANOTINITIALIZED
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEADDRINUSE
ソケットのローカル アドレスは既に使用されており、SO_REUSEADDRでアドレスを再利用できるようにソケットがマークされていません。 このエラーは通常、バインドの実行時に発生しますが、バインドがローカル IP アドレスのワイルドカード アドレス (INADDR_ANYまたはin6addr_any) にバインドされた場合接続関数まで遅延する可能性があります。 特定のアドレスは、 接続 関数によって暗黙的にバインドされる必要があります。
WSAEINTR
ブロックしている Windows Socket 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が有効になっていないため、データグラム ソケットをブロードキャスト アドレスに接続できませんでした。

解説

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

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

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

 

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

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

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

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

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

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

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

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

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

コード例

次の例では、 connect 関数の使用方法を示します。
#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 関数を使用する別の例については、「winsock ではじめにする」を参照してください。

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

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

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

要件

   
サポートされている最小のクライアント 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