■
ネットワーク処理にはWindowsなのでWinsock2を使います。
・非ブロッキング・シングルスレッド
DWORD dw = 1;// 非ブロックモードに
::ioctlsocket(Soc, FIONBIO, &dw);// Nagleアルゴリズムを使用しない
::setsockopt(Soc, IPPROTO_TCP, TCP_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したものです。
ゲームに限らず、ネットワークアプリケーション全般に使えます。