問題タブ [networkstream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - ネットワーク ストリームからの読み取り: パケットの断片化
を通じて 2 つのクライアントを管理しているサーバーを取得しましたNetworkStream.Read
。
アプリケーション プロトコルは次のとおりです。
ClientMessage [128 Bytes] → サーバーからの応答 [128 Bytes]
サーバー側:MyTcpClient.GetStream().Read()
クライアント側からのすべてのメッセージは正確に 128 バイトの長さですが、< 128 バイトのみを返すことは可能ですか?
このようなクライアント メッセージは、tcp/ip レイヤーの 1 つのパケットに収まるほど短いと思いますが、ある種の断片化やランダムが発生する可能性はありますか?
NetworkStream.DataAvailable
これに対して防御するための正しい属性はありますか?
何時間もスムーズに実行した後、奇妙なエラーや接続の切断が発生することがあります。
前もって感謝します。
c# - NetworkStream でブロッキング StreamReader.EndOfStream を停止する方法
私はむしろTcpClient
そのスピンを使ってクラスを持ってThread
いwhile (!streamReader.EndOfStream) {}
ますNetworkStream
。TCP 接続が開いていて、読み取るデータがない限り、EndOfStream
実行がブロックされるため、スレッド外からの読み取りを中止するにはどうすればよいでしょうか。
がブロックされているため、呼び出されEndOfStream
たプライベート フィールドを設定しても (少なくとも私のテストでは) 単独ではあまり効果がありません。そのため、私が行ったことは次のとおりです。stop
true
これは a からの読み取りを中止するための推奨される方法ですか、NetworkStream
それとも安全に (ただし強制的に) すべてを破棄するために使用できる他の手法はありますか?
.net - TCPClient と NetworkStream を Silverlight に移植する方法は?
TCPClient と NetworkStream が Silverlight にないのはなぜですか?
TCPClient と NetworkStream の Silverlight への既知のポートはありますか?
存在しない場合、ソース コードを .NET 4 ランタイムから自分のライブラリにコピーすることはできますか?
そうでない場合、これらのクラスを Silverlight に移植するにはどうすればよいですか?
c# - Socket/NetworkStream を非同期で適切に記述するにはどうすればよいですか?
TCP 接続の読み取り/書き込みにNetworkStream
(またはおそらく)を使用したい。Socket
複数のスレッドを処理したり、ネットワーク操作のブロックで一部のスレッドが停止する可能性がある場合にプログラムを停止する方法の問題に対処したりする必要がないように、非ブロック操作を使用したいと考えています。
NetworkStream.Readのドキュメントは、それが非ブロッキングであることを暗示しています (「読み取りに使用できるデータがない場合、Read メソッドは 0 を返します」)。
しかし、書くことはどうですか?Microsoft には、このテーマに関する通常の低品質のチュートリアルAsyncCallback
があり、すべての操作に対して面倒なメソッドを作成することを提案しています。このコールバック内のコードのポイントは何ですか?
のドキュメントにAsyncCallback
は、「非同期操作が完了したときに呼び出されるコールバック メソッド」であると書かれています。操作が既に完了している場合、なぜ電話する必要があるのSocket.EndSend(IAsyncResult)
でしょうか? 一方、のドキュメントにNetworkStream.BeginWrite
は、「デリゲートを実装するコールバック メソッドを作成し、AsyncCallback
その名前をBeginWrite
メソッドに渡す必要があります。少なくとも、状態パラメーターには . が含まれている必要がありますNetworkStream
。」と書かれています。
しかし、なぜ「しなければならない」のでしょうか。IAsyncResult
どこかに保管できないのでしょうか...
...そして定期的に完了したかどうかを確認しますか?
(これはポーリングを意味することは知っていますが、ほとんどの場合アクティブであると予想されるサーバーにあり、アイドル時にいくつかの Thread.Sleeps を計画しています。)
別の問題。送信するメッセージは、ヘッダー配列と本文配列に分割されます。2 つの BeginWrite を続けて発行できますか?
また、Socket と NetworkStream のどちらを使用するかについての意見も歓迎します。
c# - 回線ベースのネットワーク ワーカー クラスを実装する適切な方法は何ですか
IRC クライアントを作成していますが、クライアントとサーバーの間で回線を送受信するだけの IRC に依存しないネットワーク クラスが必要です。回線を送信することは問題ありませんが、リスナー スレッドを実装する良い方法が見つからないのです。私が試したすべての方法は機能しますが、回避できない欠点があります。
私の最初の方法は、ベースとして使用してStreamReader
呼び出されたを作成し、 . これには、回線が受信されるまでバックグラウンド リスナー スレッドが自動的に停止するという利点があります。問題は、リスナー スレッドを切断して停止する (またはアプリケーションが終了する) ときに、待機中のスレッドが強制終了されるだけで、ガベージ コレクションなどにどの程度適しているかがわからないことです。スレッドが孤立して、リソースを盗んでバックグラウンドにとどまる可能性はありますか?_reader
TcpClient.GetStream()
_reader.ReadLine()
ReadLine()
私の 2 番目の方法は、同じ に基づいてNetworkStream
呼び出された を作成し、false の場合は while ループをチェックするループを作成し、それ以外の場合はバイトを StringBuilder にプッシュし、即座にチェックして行全体を抽出することでした。これにより、データの取得時に ReadLine と同じ効果が得られますが、一定のループが好きではありません。私の Core i5 CPU では、CPU を必要としませんが、より強力な i9 ラップトップでは、常に仮想 CPU を盗みます。これを「解決」しますが、汚い修正のように見え、インターネット上の多数の記事がこれをコードの匂いとして分類しています。_reader
TcpClient.GetStream()
_reader.DataAvailable
continue
\r\n
_reader.DataAvailable
Thread.Sleep(1)
では、適切な解決策は何でしょうか?
c# - クライアント接続が切断されたときの NetworkStream.BeginRead
非同期呼び出し NetworkStream.BeginRead (非同期コール バック デリゲートを渡す) を介して読み取られている TCP クライアント ストリームを取得しました。問題は、接続がいつダウンしたかを検出することです。現在、接続が切断された場合、BeginRead 呼び出しはイーサに消えます。コールバックは呼び出されません。ダウン中にアプリがストリームで送信を試みると、コールバックがトリガーされ、NetworkStream.EndRead が例外をスローします。これは問題ありませんが、送信が発行されない場合、アプリは接続がダウンしていることに気づかずにそのまま待機します。
最初に、NetworkStream.ReadTimout が設定されていない (つまり、デフォルトの Timout.Infinite である) ことがわかりましたが、これを (たとえば、3000ms に) 設定しても役に立ちませんでした。[編集: MSDN doc は、ReadTimeout が非同期の BeginRead ではなく同期読み取り呼び出しにのみ適用されることを明確に述べています - 以前にもっと注意深く確認する必要がありました :-( ]
クライアント接続が失敗したことを検出する方法は?
この SO questionに示されているように、基になるソケットをポーリングする必要がありますか?
さらに、接続が物理的に再確立されても、コールバックはまだ呼び出されません。送信を試みるまで、イーサ内で待機するだけです。
c# - c#SslStream.Readループの問題
私はアプリを作成してC#を学んでいますが、本当に苦労している問題にぶつかりました。
基本的に、私は以下のコードを持っています。これは、私がセットアップしたネットワークストリームから読み取るために使用しているものです。これは機能しますが、sslstream.Read()のブロックが解除されるたびに1つのパケットを読み取るだけです。それはメッセージの大きなバックログを引き起こします。
読み取ろうとしているのは、読み取られたストリームの一部に複数のパケットが含まれていて、それらすべてを読み取った場合です。
私はそれを解決するために何度も試みましたが、私はちょうどコードの大きな混乱に終わりました。
誰かが手伝ってくれるなら、私はそれをいただければ幸いです!
(各パケットの最初の4バイトはパケットのサイズです。パケットの範囲は8バイトから28,000バイトです)
finance - 高解像度の財務データはどこにありますか
私は公平性のためにいくつかの機械学習ソフトウェアを書いています、そしていくつかのダニデータまたは少なくとも3または5分のデータを見つけたいです。
テストに1、2年かかりたいです。
どこかの主要な交換からのものである限り、データがどの交換からのものであるかはあまり気にしません。
また、遅延した「ライブ」データのデータストリームに接続できる場所はありますか?
データは無料である必要はありませんが、無料の方が良いです:-)
c# - NetworkStream.Write はいつまでブロックしますか?
これらの可能な答えを考えることができます:
- データが IP スタック内の内部バッファーに書き込まれるまで。
- データがネットワーク経由で送信されるまで。
- 相手機から受信確認があるまで。
sockets - Windows Phone7.1MangoおよびNetworkStream。含まれていますか?良い選択肢はありますか?
NetworkStreamクラスはMangoSDKに含まれていませんか?System.Netアセンブリにはないようですが、別の場所にある可能性があります。それが利用できない場合(なぜだろうか)、良い代替手段は何でしょうか?自分で実装するのが最善の方法でしょうか?