1

クライアントソケットが現在接続を維持しているかどうかを確認することはできますか?AsyncCallBack操作を使用するマルチスレッドサーバーを使用しています。この問題についても同様の質問がたくさんあり、Socket.Pollメソッドについて読んだことがあります。すべてが正しく機能しません。

このサンプルを適用しようとしました:

    bool IsConnectedAviable(Socket s)
    {
        try
        {
            if (s != null && s.Connected)
            {
                if (s.Poll(0, SelectMode.SelectRead))
                {
                    byte[] buff = new byte[1];
                    if (s.Receive(buff, SocketFlags.Peek) == 0)
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }

                return true;
            }
            else
            {
                return false;
            }
        }
        catch
        {
            return false;
        }
    }

前もって感謝します!:)

4

2 に答える 2

2

相手から何かを受け取った場合は、接続がまだ有効であることがわかります。しばらく相手から何も受信しない場合、接続がまだ有効であるかどうかを判断する唯一の方法は、何かを送信することです。

于 2012-06-20T13:20:19.867 に答える
0

ソケットについての考え方を変える必要があると思います。少し単純化すると、「完全に切断されている」と「おそらく切断されている」という2つの状態があります。それに応じてコーディングします。「おそらく切断された」状態では、データを送信するのが最善の方法です。TCPを使用していて、配信が成功した場合、何も起こりません。そうでない場合は、例外が発生しますが、TCPが再試行を試みた後、ほんの数秒後になります。

これは現実世界の必要悪です。あなたが乗っている電車がトンネルに入ったばかりかもしれません。方法が「はい、私は接続されています」と言った場合、それは実際には嘘になります。

于 2012-06-20T13:19:45.750 に答える