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을 반환합니다. 이 경우 다음과 같은 세 가지 시나리오가 있습니다.

  • select 함수를 사용하여 소켓이 쓰기 가능한지 확인하여 연결 요청 완료를 확인합니다.
  • 애플리케이션이 WSAAsyncSelect 를 사용하여 연결 이벤트에 대한 관심을 나타내는 경우 애플리케이션은 연결 작업이 완료되었음을 나타내는 FD_CONNECT 알림을 받게 됩니다(성공 여부).
  • 애플리케이션이 WSAEventSelect 를 사용하여 연결 이벤트에 대한 관심을 나타내는 경우 연결된 이벤트 개체에 연결 작업이 완료되었음을 나타내는 신호가 표시됩니다(성공 여부).

비 차단 소켓에서 연결 시도가 완료될 때까지 동일한 소켓에서 연결 하기 위한 모든 후속 호출은 연결이 성공적으로 완료되면 오류 코드 WSAEALREADYWSAEISCONN 으로 실패합니다. Windows 소켓 사양 버전 1.1의 모호성으로 인해 연결이 이미 보류 중인 동안 연결 에서 반환된 오류 코드는 구현마다 다를 수 있습니다. 따라서 애플리케이션에서 연결에 여러 호출을 사용하여 연결 완료를 검색하는 것은 권장되지 않습니다. 이렇게 하면 강력한 작업을 보장하기 위해 WSAEINVALWSAEWOULDBLOCK 오류 값을 WSAEALREADY를 처리하는 것과 동일한 방식으로 처리할 준비가 되어 있어야 합니다.

반환된 오류 코드가 연결 시도가 실패했음을 나타내는 경우(즉, WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT) 애플리케이션은 동일한 소켓에 대해 connect 를 다시 호출할 수 있습니다.

오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEADDRINUSE
소켓의 로컬 주소가 이미 사용 중이며 SO_REUSEADDR 주소를 다시 사용할 수 있도록 소켓이 표시되지 않았습니다. 이 오류는 일반적으로 바인딩을 실행할 때 발생하지만 바인딩이 로컬 IP 주소의 와일드카드 주소(INADDR_ANY 또는 in6addr_any)에 있는 경우 연결 함수까지 지연될 수 있습니다. 특정 주소는 connect 함수에 의해 암시적으로 바인딩되어야 합니다.
WSAEINTR
차단 Windows 소켓 1.1 호출이 WSACancelBlockingCall을 통해 취소되었습니다.
WSAEINPROGRESS
차단 Windows 소켓 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEALREADY
비 차단 연결 호출이 지정된 소켓에서 진행 중입니다.
참고 이전 버전과의 호환성을 유지하기 위해 이 오류는 Winsock.dll 또는 Wsock32.dll 연결되는 WSAEINVAL 에서 Windows Sockets 1.1 애플리케이션으로 보고됩니다.
 
WSAEADDRNOTAVAIL
원격 주소가 유효한 주소(예: INADDR_ANY 또는 in6addr_any)가 아닙니다.
WSAEAFNOSUPPORT
지정된 패밀리의 주소는 이 소켓에서 사용할 수 없습니다.
WSAECONNREFUSED
연결 시도가 강제로 거부되었습니다.
WSAEFAULT
이름으로 가리키는 sockaddr 구조체에 연결된 주소 패밀리의 주소 형식이 잘못되었거나 namelen 매개 변수가 너무 작습니다. namelen 매개 변수에 지정된 길이가 있는 이름 매개 변수가 가리키는 sockaddr 구조체가 사용자 주소 공간의 유효한 부분에 없는 경우에도 이 오류가 반환됩니다.
WSAEINVAL
매개 변수 s 는 수신 대기 소켓입니다.
WSAEISCONN
소켓이 이미 연결되어 있습니다(연결 지향 소켓만 해당).
WSAENETUNREACH
현재 이 호스트에서 네트워크에 연결할 수 없습니다.
WSAEHOSTUNREACH
연결할 수 없는 호스트로 소켓 작업을 시도했습니다.
WSAENOBUFS
참고 버퍼 공간을 사용할 수 없습니다. 소켓을 연결할 수 없습니다.
 
WSAENOTSOCK
s 매개 변수에 지정된 설명자가 소켓이 아닙니다.
WSAETIMEDOUT
연결을 설정하지 않고 연결 시도가 시간 초과되었습니다.
WSAEWOULDBLOCK
소켓은 차단 해제로 표시되며 연결을 즉시 완료할 수 없습니다.
WSAEACCES
setockopt 옵션 SO_BROADCAST 사용하도록 설정되지 않아 데이터그램 소켓을 브로드캐스트 주소에 연결하지 못했습니다.

설명

connect 함수는 지정된 대상에 대한 연결을 만드는 데 사용됩니다. 소켓 언바운드인 경우 고유 값이 시스템에 의해 로컬 연결에 할당되고 소켓이 바인딩된 것으로 표시됩니다.

연결 지향 소켓(예: SOCK_STREAM 입력)의 경우 이름 (소켓 네임스페이스의 주소, 자세한 설명은 바인딩sockaddr 참조)을 사용하여 외부 호스트에 대한 활성 연결이 시작됩니다.

참고 소켓이 열리면 setsockopt 호출이 수행되고 sendto 호출이 수행되면 Windows Sockets는 암시적 바인딩 함수 호출을 수행합니다.

 

소켓 호출이 성공적으로 완료되면 소켓이 데이터를 보내고 받을 준비가 됩니다. name 매개 변수로 지정된 구조체의 주소 멤버가 0으로 채워진 경우 connectWSAEADDRNOTAVAIL 오류를 반환합니다. 활성 연결을 다시 연결하려는 시도는 오류 코드 WSAEISCONN으로 실패합니다.

연결 지향 비블로킹 소켓의 경우 연결을 즉시 완료할 수 없는 경우가 많습니다. 이 경우 이 함수는 WSAEWOULDBLOCK 오류를 반환합니다. 그러나 작업이 진행됩니다.

성공 또는 실패 결과가 알려지면 클라이언트가 알림을 등록하는 방법에 따라 두 가지 방법 중 하나로 보고될 수 있습니다.

  • 클라이언트가 select 함수를 사용하는 경우 writefds 집합에서 성공이 보고되고 예외 집합에 오류가 보고됩니다.
  • 클라이언트가 WSAAsyncSelect 또는 WSAEventSelect 함수를 사용하는 경우 알림이 FD_CONNECT 함께 발표되고 FD_CONNECT 연결된 오류 코드는 성공 또는 특정 실패 이유를 나타냅니다.

연결이 즉시 완료되지 않은 경우 클라이언트는 setsockopt를 사용하여 소켓 옵션을 설정하기 전에 연결 완료를 기다려야 합니다. 연결이 진행 중인 동안 setsockopt를 호출하는 것은 지원되지 않습니다.

연결 없는 소켓(예: SOCK_DGRAM 입력)의 경우 연결로 수행되는 작업은 후속WSASendrecv/ WSARecv 호출/ 사용할 수 있는 기본 대상 주소를 설정하는 것일 뿐입니다. 지정된 대상 주소 이외의 주소에서 받은 모든 데이터그램은 삭제됩니다. 이름으로 지정된 구조체의 주소 멤버가 0으로 채워지면 소켓의 연결이 끊어집니다. 그런 다음 기본 원격 주소가 확정되지 않으므로WSASendrecv/ WSARecv 호출을 보내/ 면 오류 코드 WSAENOTCONN이 반환됩니다. 그러나 sendto/ WSASendTowSARecvFrom의 recvfrom/ 은 여전히 사용할 수 있습니다. 소켓이 이미 연결되어 있더라도 연결을 다시 호출하기만 하면 기본 대상을 변경할 수 있습니다. 이름이 이전 연결과 다른 경우 수신 대기 중인 모든 데이터그램은 삭제됩니다.

연결 없는 소켓의 경우 이름은 브로드캐스트 주소를 포함하여 유효한 주소를 나타낼 수 있습니다. 그러나 브로드캐스트 주소에 연결하려면 소켓이 setsockopt 를 사용하여 SO_BROADCAST 옵션을 사용하도록 설정해야 합니다. 그렇지 않으면 WSAEACCES 오류 코드로 연결이 실패합니다.

소켓 간의 연결이 끊어지면 연결된 소켓을 삭제하고 새 소켓을 만들어야 합니다. 연결된 소켓에서 문제가 발생하면 애플리케이션은 소켓을 삭제하고 다시 소켓을 만들어 안정적인 지점으로 돌아가야 합니다.

참고Connect와 같은 차단 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 함수를 사용하는 또 다른 예제는 시작 With Winsock을 참조하세요.

IrDA 소켓에 대한 참고 사항

  • Af_irda.h 헤더 파일을 명시적으로 포함해야 합니다.
  • 미디어 액세스 수준에서 기존 IrDA 연결이 검색되면 WSAENETDOWN 이 반환됩니다.
  • 주소가 다른 디바이스에 대한 활성 연결이 있는 경우 WSAEADDRINUSE 가 반환됩니다.
  • 소켓이 이미 연결되어 있거나 배타적/멀티플렉싱 모드 변경에 실패한 경우 WSAEISCONN 이 반환됩니다.
  • 소켓이 이전에 바인딩을 사용하여 들어오는 연결을 수락하기 위해 로컬 서비스 이름에 바인딩된 경우 WSAEINVAL 이 반환됩니다. 소켓이 바인딩되면 아웃바운드 연결을 설정하는 데 사용할 수 없습니다.

IrDA는 sockaddr_irda 양식의 주소를 사용하여 connect 함수를 구현합니다. 일반적으로 클라이언트 애플리케이션은 소켓 함수를 사용하여 소켓을 만들고, IRLMP_ENUMDEVICES 소켓 옵션을 사용하여 IrDA 디바이스의 바로 주변을 검색하고, 반환된 목록에서 디바이스를 선택하고, 주소를 구성한 다음, 연결을 호출합니다. 차단 및 비블로킹 의미 체계 사이에는 차이가 없습니다.

요구 사항

   
지원되는 최소 클라이언트 Windows Vista [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 winsock2.h
라이브러리 Ws2_32.lib
DLL Ws2_32.dll

추가 정보

WSAAsyncSelect

WSAConnect

ConnectEx

Winsock 함수

Winsock 참조

받아들일

bind

getsockname

선택

sockaddr

socket