글 작성자: Sowhat_93
	SOCKET SOCK						= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	
	//상대 쪽에 고지할 IP와 포트를 설정.
	sockaddr_in	MyAddress			= { 0 , };
	MyAddress.sin_addr.S_un.S_addr	= ADDR_ANY;
	MyAddress.sin_family			= AF_INET;
	MyAddress.sin_port				= 0;

	bind(SOCK, (const sockaddr*)&MyAddress, sizeof(MyAddress));

	//완료 통지를 받을 소켓을 IOCP에 등록한다.
	CreateIoCompletionPort(SOCK, hCompletionPort, (ULONG_PTR)SOCK, 0);
	
	
	//ConnectEx 함수 포인터를 얻어온다.
	GUID guid = WSAID_CONNECTEX;
	LPFN_CONNECTEX FPConnEx = nullptr; //MSWSock.h 에 정의 되어있다.
	unsigned long cbBytes;
	WSAIoctl(SOCK, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), &FPConnEx, sizeof(FPConnEx), &cbBytes, nullptr, nullptr);
	
	//완료 통지 받았을때의 구분을 위해 enum 값 설정.
	MyOverlappedStruct pOVS = new MyOverlappedStruct;
	pOVS->type = ETYPE::IO_CONNECT;

	unsigned int Transferred = 0;

	//ConnetEx 호출. 
	//IOCP를 통해 완료 통지가 들어올 것 이다.
	int ConnExRet = FPConnEx(SOCK, (const sockaddr*)&RemoteAddr, sizeof(RemoteAddr), NULL, NULL, NULL, (LPOVERLAPPED)OVS);
	if (ConnExRet == SOCKET_ERROR && WSA_IO_PENDING != WSAGetLastError())
	{
		//Error.
	}

Connect 에 대한 통지를 비동기로 받고 싶을때 사용한다.

주의 할점은 미리 상대측에 고지할 IP가 socket에 bind 되어 있어야 한다는 점이다.