2

C# でソケット サーバーを構築していますが、予定外のソケットの切断に問題があります。今のところ、私はこれを次のように処理しています:

private List<TCPClient> _acceptedClientsList = new List<TCPClient>();
public void checkIfStillConnected()
{
    while (true)
    {
        lock (_sync)
        {
            for (int i = 0; i < _acceptedClientsList.Count(); ++i)
            {
                if (_acceptedClientsList[i].Client.Client.Poll(10, SelectMode.SelectRead) == true && (_acceptedClientsList[i]).Client.Client.Available == 0) // 5000 is the time to wait for a response, in microseconds.
                {
                    NHDatabaseHandler dbHandler = new NHDatabaseHandler();
                    dbHandler.Init();
                    if (_acceptedClientsList[i].isVoipClient == true)
                    {
                        dbHandler.UpdateUserStatus(_acceptedClientsList[i].UserName, EStatus.Offline);
                    }
                    RemoveClient(i); // this function removes the selected client at i from the acceptedClientsList
                    i--;
                }
            }
        }
    }
}

しかし、これはまったく最適化されていません。これは、socket.poll を使用してすべてのソケットのステータスを毎回無限にチェックするスレッドです...

それが最善かどうかはわかりませんが... 重くて変な感じです。誰にもアイデアがありますか?

ありがとう

4

1 に答える 1

0

各ソケットから受信データを読み取る専用スレッドを 1 つ用意することをお勧めします。予定外のソケット切断が発生した場合 (たとえば、クライアント側のネットワークがドロップアウトまたはクラッシュした場合)、ソケットは例外をスローします。次に、例外をキャッチし、ソケット接続を閉じて、他のソケットを実行したままスレッドを正常に終了できます。

このチュートリアルで TCP/IP 通信を学びました。

http://www.codeproject.com/Articles/155282/TCP-Server-Client-Communication-Implementation

著者は彼の実装を非常によく説明しています。そこから学ぶ価値があります。これを参照して、独自のライブラリを書き換えることができます。

于 2015-09-08T02:14:10.973 に答える