C#のソケット通信でクライアントが切断したか調べる

あとで別記事書きますが簡単なソケット通信サーバーを書いた時に困ったのでメモ
クライアントの切断を検知するのにConnectedプロパティを使えば良さそうだなって思って痛い目にあった
信頼と実績のstackoverflowに解決策がありました

Socketクラスの場合

 1Socket client = listener.EndAcceptSocket(ar);
 2
 3while (clinet.Connected){
 4    byte[] bytes = new byte[256];
 5    client.Receive(bytes);
 6    string s = Encoding.UTF8.GetString(bytes);
 7
 8    // 何かする
 9
10    if ( client.Poll(1000, SelectMode.SelectRead) && (client.Available == 0) ){
11         break;
12    }
13}

こんな感じ

余談ですがwhileの外にstring buf = "";って宣言してその変数に加算代入していくと最初に代入した値しか入ってないんですがバグですかね・・・?
結局TCPClientクラスからNetWorkStream貰ってStreamReaderで取得したんですが

TCPClientクラスの場合

TcpClientのプロパティにClientがあり、ここからSocketクラスが取得出来るのでほぼ一緒です

 1TcpListener listener = (TcpListener) ar.AsyncState;
 2TcpClient client = listener.EndAcceptTcpClient(ar);
 3NetworkStream stream = client.GetStream();
 4StreamReader reader = new StreamReader (stream);
 5
 6while (client.Connected) {
 7    while(!reader.EndOfStream){
 8        string s = reader.ReadLine();
 9    }
10    if ( client.Client.Poll(1000, SelectMode.SelectRead) && (client.Client.Available == 0) ){
11        break;
12    }
13}