2009-08-08 3 views
3

私は一つだけ条件の(データは読み込みのために利用可能である)を満たす場合、C#でソケットをポーリングする方法があるかどうかを思ったんだけど、私はsocket.Poll方法を知ってるが、これはtrueを返すことができます場合は、ここで指定された真のリターンを指定した3つの条件のいずれかの数:MSDN: Socket.Poll何かが読めるようになったときだけ、C#でソケットをポーリングする方法はありますか?

答えて

5

Listen()が呼び出された場合

Poll(microSeconds, SelectMode.SelectRead);

  1. のためにtrueを返す3つの原因があるとの接続が
  2. を読み取るためのデータが利用可能である場合に
  3. を保留しています接続がクローズ、リセット、または終了した場合

は、我々はそれらを区別することができるかどうか見てみましょう:

  1. Listen()が以前に呼び出されている場合は、必ず知っているので、あなたがいない場合、その原因を検討する必要はありません。
  2. あなたはそれに行きます。
  3. あなたはPoll()コールに滞在できず、実際に何が起きたのかを知る必要があることを意味します。 1つの方法は、Poll()が返された直後にソケットの状態をチェックすることです。

結論:

  1. と3と考えるべきではない必要があります。trueが返されるたびにソケットの状態をチェックすることで処理できます。

だから私は(未テスト)のために行くだろう:

if (s.Poll(microSeconds, SelectMode.SelectRead))) 
{ 
    if (!s.Connected) 
    // Something bad has happened, shut down 
    else 
    // There is data waiting to be read" 
} 
+0

ご回答いただきありがとうございます。 –

+0

あなたは、Connectedがフードの中で何をしているかのように、読み込みの前に最初にWriteのpollまたはpollを呼び出す前にConnectedをチェックする必要があります。 – Jay

1

は、クラスNetworkStreamで何かを発見しました。プロパティNetworkStream.DataAvailableは、データが読み込み可能な場合はtrueを返します。ネットワークストリームのオブジェクトは、TcpListenerとTcpClientを処理して返されます。これは、ソケットよりも高い抽象レベルです。

私はNetworkStreamにソケットから来るする方法を発見しました。 NetworkStreamはソケットを使用しており、ソケットのストリーム表現です。しかし、ネットワークストリームがソケットで何をしているのか分かりません。

1

あなたは、基になるハンドルでselect()システムコールを使用することができます。

+1

私が最初に思ったこともありましたが、暗い星が本当に意味するものであれば、これは恥ずかしがりません。 – Christian13467

0

Listenが呼び出され、接続が保留中の場合はtrue。 - または - データが読み取り可能な場合はtrueです。 - または - 接続が閉じられた、リセットされた、または終了した場合はtrueです。 、そうでない場合はfalseを返します。

私は2番目のオプションがtrueを返すものですかどうかを確認したいことを理解できますか? Pollがtrueを返すかどうかを確認した後、接続が開いているかどうかを確認することができます。接続されていない、閉じられている、リセットされている、それが開いている場合

、それは第二の選択肢は、trueを返します。

+0

のように:if(m_sock.Poll(-1、SelectMode.SelectRead)&&(m_sock.Connected == true))? –

+0

私はそれを仮定します、はい。 – Phoexo

4

SocketプロパティAvailableを使用できます。読み取ることができるデータの量を返します。 MSDNのドキュメントによると

1

あなたが代わりにポール(の選択()メソッドを使用することができます)。 実際にILSpy(リフレクタツール)でSocket.Pollを調べるとき、内部コードはソケット上でselectを呼び出しています。

また、タイトなループでPoll()を呼び出すと、各呼び出しで新しいIntPtr []が実行されるため、メモリ割り当てが増加します。 Calling Select()を呼び出すと、フード内に新しい配列を割り当てる代わりに配列を再利用できます。

関連する問題