問題タブ [tcpclient]
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.
vb.net - 1つまたは2つの方法でチャットシステム?
ポート5900で最初からリッスンを開始し、クライアントがそのポートに接続するとチャットが確立される、単純なチャットクライアント/ソフトウェア(実行可能ファイル全体)を構築しようとしています。
問題は、クライアントだけがサーバーとチャットでき、接続が一方向で機能しているため、サーバーがクライアントに応答できないことです。
接続を確立するときに「サーバー」からクライアントに接続しようとしましたが、ポートがすでに使用されていることを警告するシステムクラッシュが発生しました。
これは私のコードです:(一方向で動作します)
私は何をすべきですか?2つのポートを使用しますか?1つは書き込み用、もう1つは読み取り用ですか?また、複数のクライアントを1人のユーザーに接続する必要がある場合はどうなりますか?(同じexeがサーバー/クライアントであることを忘れないでください)
助けてください=(
c# - C# NetworkStream.Read の奇妙さ
このコードの欠陥を指摘できる人はいますか? TcpClient で HTML を取得しています。IIS サーバーとの通信中に NetworkStream.Read() が終了しないようです。代わりに Fiddler プロキシを使用すると問題なく動作しますが、ターゲット サーバーと直接通信すると、「リモート サーバーが接続を閉じました」などのエラーで接続例外が発生するまで、.read() ループは終了しません。
アップデート
デバッガーでは、応答全体がすぐに送信され、StringBuilder (応答) に追加されていることがわかります。サーバーが応答の送信を完了したとき、または私のコードがそれを検出していないときに、接続が閉じられていないように見えます。
結論 ここで述べたように、トランザクションがいつ完了するかを判断するには、プロトコル (HTTP の場合は Content-Length ヘッダー) の機能を利用するのが最善です。ただし、すべてのページに content-length が設定されているわけではないことがわかりました。だから、私は今ハイブリッドソリューションを使用しています:
すべてのトランザクションの場合、リクエストの
Connection
ヘッダーを「close」に設定して、サーバーがソケットを開いたままにしないようにします。これにより、サーバーがリクエストへの応答中に接続を閉じる可能性が向上します。が設定されている場合
Content-Length
は、それを使用してリクエストがいつ完了するかを判断します。それ以外の場合は、NetworkStream の RequestTimeout プロパティを 1 秒などの大きな、しかし妥当な値に設定します。
NetworkStream.Read()
次に、 a) タイムアウトが発生するか、b) 要求したよりも少ないバイト数を読み取るまでループします。
すばらしい詳細な回答をくださった皆さんに感謝します。
c# - C# で TcpClient ローカル エンドポイントを設定する際の問題
次のコードが C# で機能しないのはなぜですか?
「ターゲットマシンが積極的に拒否したため、接続できません」と表示されます。そのため、TcpClient コンストラクターはポートをバインドしていないように見えますが、Socket.Bind() 関数を試してもうまくいきませんでした。
c# - 確立された接続がホスト マシンのソフトウェアによって中止されたというメッセージが表示された SocketException の原因と原因を特定する方法
同様の質問が何度も出されている可能性があることは知っていますが、私が見ている動作を表し、誰かがこの原因を予測するのに役立つかどうかを知りたい.
TCP 経由で他の Windows サービスに接続する Windows サービスを作成しています。これには 100 のユーザー エンティティがあり、それぞれに 5 つの接続があります。これらのユーザーは、個々の接続を使用してタスクを実行します。
アプリケーションは、この問題が 1 ~ 2 日表示されないまま続行されます。または、起動直後に問題が発生する場合があります (-めったにありません)。私が行った最高の実行は、この例外を示さずに4〜5日程度でした. その後、そのアプリケーションが停止するか、さまざまな理由で停止する必要がありました。
何が原因なのか知りたいですか?ここにスタックトレースがあります。
System.IO.IOException: Unable to write data to the transport connection: An established connection was aborted by the software in your host machine. ---> System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine
at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Security._SslStream.StartWriting(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security._SslStream.ProcessWrite(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
c# - TcpClientの作成には多くのオーバーヘッドがありますか?
TcpClientを使ってデータの送受信を試みました。私は2つの実験を行い、何か面白いものを見つけました。
日本のサーバーにTcpListenerをセットアップし、英国のサーバーにTcpClientをセットアップしました。TcpListenerに500バイトを送信し続け、TcpListenerが10KBをTcpClientに送り返すとき。この送信/受信ループを各実験で500回維持しました。
実験1:
すべての送受信ループで、新しいTcpClientを作成し(作成直前から時間が刻みます)、送受信します
実験2:
すべてのループで、TcpClientは1つしかなく、TcpListenerとの接続を維持し、500回の送受信を行います。
結果:
1つのループの時間コストの平均値:
E1:1.8秒、E2:0.49秒。
私はこの結果に非常に驚いています。したがって、一定の送受信のために接続を維持することで、多くの時間を節約できますか?ほぼ2/3の時間。
これは本当ですか???
ありがとう
====新しい====
@ Jon Skeet、@ dbemerlin、返信ありがとうございます。Tcpハンドシェイクには時間がかかると思います。
だから私は実験3をしました。
サーバーとしてHttpListenerを設定し、WebClientを使用して送受信します。データサイズはまったく同じです。そして、新しいWebClientを使用して、英国と日本の間で送受信するたびに。
結果は0.86です(500回のループの平均、つまり送信/受信)。
WebClient / HttpLisener自体はTcpだと思いますよね?私の実験では、生のTcpClient / TcpListenerよりもどのように高速になりますか?
再度、感謝します
c# - C# で TcpClient.Connect() を使用して WHOIS 検索を行うのはコストがかかりますか?
お客様から、サイトにアクセスしているユーザーの IP に基づいて、ASP.NET サイトのホームページで動的な whois ルックアップを行うよう依頼されました。
実装は、ここで説明されているようなものになります。
http://www.aspheute.com/english/20000825.asp
しかし、このコードが whois.networksolutions.com に接続していることに気付きました。ページが読み込まれるたびにこのリモート サーバーへの接続を開始する場合、これはうまくスケーリングできない可能性があると考えています。
たとえば、1000 人の異なるユーザーがホームページにアクセスしたとします。これにより、多数の接続が開始されます。
これについて何か考えはありますか?
.net - TcpClient はどのように IDisposable を実装し、パブリック Dispose メソッドを持たないことができますか?
タイトルが言うように:
TcpClient はどのように IDisposable を実装し、パブリック Dispose メソッドを持たないことができますか?
c# - TcpClient - データが利用可能になるのを待っています
私の C# アプリケーションには、停止するように指示されるまで、基本的に TcpClient から継続的に読み取るスレッドがあります。この目的で WaitHandles を使用します。たとえば、次のようにします。
ご覧のとおり、スレッドが停止するように指示されるのを待っています。そうでない場合は、TcpClient からすべてのデータを読み取り、ループします。
私が抱えている問題は、10ms の遅延です。私はそれを減らすことができましたが、スレッドが停止するように指示されるか、より多くのデータが利用可能になるまで、プログラムが一時停止するソリューションを好みます。
実際、私が欲しいのは、TcpClient でデータが利用可能になるタイミングを教えてくれる WaitHandle です。そうすれば、WaitHandle.WaitAny を使用できます。これを行う方法はありますか、または誰かが別のアプローチを提案できますか?
これは、かなり高性能で軽量なバックグラウンド プロセスである必要があるため、面倒ではありません。
c# - サーバーのマルチスレッドはやり過ぎですか?
現在、外部クライアントからの接続を通常どおりリッスンし、接続時にリクエストを処理するサーバータイプのアプリケーションを作成しています。
現時点では、私の実装では、クライアントが接続するたびにスレッドのペアが作成されます。1 つのスレッドはソケットから要求を読み取ってキューに追加し、2 つ目のスレッドはキューから要求を読み取って処理します。
基本的に、これらのスレッドをすべて持つのはやり過ぎだと思うかどうか、そして重要なことに、このアプローチが問題を引き起こすかどうかについての意見を探しています.
ほとんどの場合、これらのスレッドはアイドル状態になることに注意することが重要です。私は両方のスレッドで待機ハンドル (ManualResetEvent) を使用しています。リーダー スレッドは、メッセージが利用可能になるまで待機し、利用可能な場合はそれを読み取り、プロセス スレッドのキューにダンプします。Process スレッドは、メッセージがキューにあることをリーダーが通知するまで待機します (ここでも、待機ハンドルを使用します)。特定のクライアントが実際にサーバーを攻撃していない限り、これらのスレッドは待機状態になります。これは費用がかかりますか?
私は少しのテストを終えました.1,000台のクライアントが絶えずしつこく接続されていました-サーバー(つまり、2,000以上のスレッド)で、非常にうまく対処しているように見えました.
c# - ストリームのみを気にしているのに、TcpClientを保存する必要がありますか?
TcpClientの新しいインスタンスがリモートホストに接続します。そのNetworkStreamが取得され、保存されます。ガベージコレクションされないように、TcpClient自体も保存する必要がありますか?
「破棄するには保存する必要があります」と答える場合:私の特定のケースでは、TcpClientは通常、長期間(アプリの存続期間)存続しているため、破棄する必要はありません。ただし、一般的に、Disposeを呼び出すためだけに保存する必要があることに同意します。