Winsock/C++ 비동기 연결 요청 함수 ConnectEX
글 작성자: 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 되어 있어야 한다는 점이다.
'소켓 프로그래밍' 카테고리의 다른 글
Winsock/C++ - IOCP 종료처리 관련 (0) | 2022.01.10 |
---|---|
Winsock/C++ - 4. setsockopt, getsockopt, WSAIoctl (0) | 2022.01.04 |
Winsock/C++ - 3. 데이터 송수신 send, recv (0) | 2022.01.03 |
Winsock/C++ - 2. TCP 연결 bind,listen,accept 그리고 connect (0) | 2022.01.03 |
Winsock/C++ - 1. WSAGetLastError, FormetMessage (0) | 2022.01.03 |
댓글
이 글 공유하기
다른 글
-
Winsock/C++ - IOCP 종료처리 관련
Winsock/C++ - IOCP 종료처리 관련
2022.01.10 -
Winsock/C++ - 4. setsockopt, getsockopt, WSAIoctl
Winsock/C++ - 4. setsockopt, getsockopt, WSAIoctl
2022.01.04 -
Winsock/C++ - 3. 데이터 송수신 send, recv
Winsock/C++ - 3. 데이터 송수신 send, recv
2022.01.03 -
Winsock/C++ - 2. TCP 연결 bind,listen,accept 그리고 connect
Winsock/C++ - 2. TCP 연결 bind,listen,accept 그리고 connect
2022.01.03