이거 제가 전에 돌리던 서버는 비동기가 아니어서 

서버에 접속할때 connect 블록돼서 시간 지체되는거때문에 ioctlsocket으로 300ms 타임아웃 걸고 connect 해서 리턴값 확인으로 접속 성공 여부 체크했는데

이 비동기 서버는 이것저것 해봤는데 이렇게 하니 잘 되는데 맞는 방법인지 봐주세요

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 
 
bool ConnectToServer(const char *host, int port)
{
    SOCKET hSock;
    u_long ipaddr;
    struct hostent *h;
    SOCKADDR_IN servAdr;
    FD_SET fds;
    struct timeval tv;
 
    if ((ipaddr = inet_addr(host)) == INADDR_NONE)
        if ((h = gethostbyname(host)) != NULL)
            ipaddr = *(u_long *)h->h_addr;
 
    hSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    ioctlsocket(hSock, FIONBIO, (u_long*)"");
    memset(&servAdr, 0sizeof(servAdr));
    servAdr.sin_family = AF_INET;
    servAdr.sin_addr.s_addr = ipaddr;
    servAdr.sin_port = htons((u_short)port);
 
    FD_ZERO(&fds);
    FD_SET(hSock, &fds);
    tv.tv_sec = 0;
    tv.tv_usec = 300000//300ms
 
    
    connect(hSock, (SOCKADDR*)&servAdr, sizeof(servAdr));
 
    ioctlsocket(hSock, FIONBIO, (u_long*)"");
    select(00, &fds, 0, &tv);
    if (!FD_ISSET(hSock, &fds))
    {
        closesocket(hSock);
        return false;
    }
    closesocket(hSock); //성공했어도 소켓 다시 만들어서 connect 하기 위해 닫음
    hSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
 
    if (WSAAsyncSelect(hSock, g_hWnd, WM_SOCKET, FD_READ | FD_CLOSE | FD_CONNECT) == SOCKET_ERROR)
    {
        closesocket(hSock);
        return false;
    }
 
    if (connect(hSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) != SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)
    {
        
        closesocket(hSock);
        return false;
    }
 
    g_clntSock = hSock;
    return true;
}
 
 
cs