ネットワーク処理にはWindowsなのでWinsock2を使います。
・非ブロッキング・シングルスレッド


    DWORD dw = 1;

    // 非ブロックモードに
    ::ioctlsocket(Soc, FIONBIO, &dw);

    // Nagleアルゴリズムを使用しない
    ::setsockopt(Soc, IPPROTO_TCPTCP_NODELAY, (char*)&dw, sizeof(dw));


Nagleアルゴリズムを使用する設定だと、小さなデータをバッファリングして送信します。
ゲームで遅延が発生するのはまずいのでOffにします。


サーバ側はlisten→select(クライアントの接続要求を検出)→accept→select(send, recv)
クライアント側はconnect→select(connectの成功を検出)→select(send, recv)


サーバのaccept検出(タイムアウト指定)は簡単で、selectすると受信可能になるのを利用します。
クライアントのconnectの検出は少しだけ工夫します。


    // 待ってみる。タイムアウトしたらエラー
    Select(dwTime);
    if (IsSend(nSocket)) {
        return TRUE;
    }


接続できたら送信可能になるのを利用して*1タイムアウト指定ができるconnect関数を作ります。
Select()やらIsSend()はwinsock::selectをwrapしたものです。
ゲームに限らず、ネットワークアプリケーション全般に使えます。

*1:追記:ここはノンブロッキングモードである必要があります。