問題タブ [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.
c# - TcpListener は、接続をクリアするよりも速く接続をキューに入れています
私が理解しているように、TcpListener
を呼び出すと、 は接続をキューに入れますStart()
。AcceptTcpClient
(または)を呼び出すたびにBeginAcceptTcpClient
、キューから 1 つのアイテムがデキューされます。
一度に 1,000 の接続をアプリに送信して負荷テストを行うTcpListener
と、キューはクリアするよりもはるかに速く構築され、(最終的には) クライアントからのタイムアウトにつながります。列。ただし、サーバーに負荷がかかっているようには見えず、アプリは CPU 時間をあまり消費しておらず、マシン上で監視されている他のリソースも十分に機能していません。現在、私たちは十分に効率的に運営されていないように感じます。
呼び出しBeginAcceptTcpListener
てすぐにスレッドに引き渡し、ThreadPool
実際に作業を実行してから、BeginAcceptTcpClient
再度呼び出します。関連する作業は、マシンに圧力をかけるようには見えません。基本的には、3 秒間のスリープとそれに続く辞書の検索、そしてTcpClient
のストリームへの 100 バイトの書き込みです。
使用しているTcpListener
コードは次のとおりです。
答えは のSockets
代わりにを使用するTcpListener
か、少なくとも を使用することに関連してTcpListener.AcceptSocket
いると思いますが、どうやってそれを行うのだろうかと思いました。
私たちが持っていたアイデアの 1 つは、 を呼び出してAcceptTcpClient
、すぐに複数のオブジェクトの 1 つに入れるというものでした。そうすれば、別のスレッド (スレッドごとに 1 つのキュー) でこれらのキューをポーリングでき、他の操作を待っている間にスレッドをブロックする可能性のあるモニターに遭遇することはありません。次に、各キュー スレッドを使用して、スレッド内で作業を完了させ、そのキュー内の次のキューからの取り出しに移ることができます。このアプローチをお勧めしますか、それとも私たちが使用している問題であり、迅速なデキューでは解決されませんか?Enqueue
TcpClient
Queue<TcpClient>
Dequeue
ThreadPool.QueueUserWorkItem
ThreadPool
TcpClient
TcpListener
c# - 複数のスレッドが同じソケットに書き込む問題
私のプログラムは、プロセス間通信にソケットを使用します。TCP クライアントのリストが接続されるのを待っている localhost のソケット ポート (B) でリッスンしているサーバーが 1 つあります。サーバーのもう一方の端には、データをインターネットに送信する別のソケット(A)があります。サーバーは、TCP クライアントから送信されたすべてのものを受け取り、インターネット上のサーバーに転送するように設計されています。私の質問は、2 つの TCP クライアントがたまたま同時にデータを送信した場合、これはサーバーの送信ソケット (A) にとって問題になるのでしょうか?
ありがとう
performance - 高性能メッセージング用のTCP接続プールを作成するためのパターンの検索
私はC#で新しいクライアント/サーバーアプリケーションを作成しており、かなり高い接続率を期待しています。そのため、クライアントとデータベース間の接続を作成および破棄するコストを軽減するのに役立つデータベース接続プールについて考えました。
私のアプリケーションに同様の機能を作成したいのですが、このパターンを適用する方法の良い例を見つけることができませんでした。サーバーにメッセージを送信して受信メッセージを受信するたびに、本当にTcpClientのインスタンスを起動する必要がありますか?各接続は1〜5 KBの間で転送され、それぞれが1KBの応答メッセージを受信することが期待されます。
この質問はやや曖昧だと思いますが、私はゼロから始めているので、提案を受け入れています。それが私の仮定がすべて間違っていることを意味するとしても。
c# - このシナリオでは TcpClient を使用する必要がありますか?
iPhoneと通信する必要があります。その IP アドレスとポート (Bonjour 経由で取得) があります。
「0x50544833」(または同様の 16 進数) のヘッダー、データのサイズ (以下)、データ自体を送信する必要があります。
データは、次のような単なる文字列です。
要件には、データをリトル エンディアン形式で送信する必要があることも記載されています (いずれにせよ、これが Intel のデフォルトだと思います)。
したがって、hex_number + データのサイズ + string_with_the_above_xml になります。
それを iPhone に送信し、応答を読み取る必要があります。
あなたの経験によると、このデータを送信する (そして応答を読む) 最良の方法は何でしょうか?
update : 私は iPhone ソフトウェアを書きませんでした。TCP/IP を使用します。ポートはオペレーティング システムによって異なりますが、常にではなく、57xxx から 60xxxx の範囲であることがわかりました。このソフトウェアの Mac 版は Tcp/Ip を使用します。私はそのソース コードにアクセスできませんが、その開発者と連絡を取り合っています。開発者は、送信する必要があるデータの形式を説明し、Bonjour サービスが解決されたら、「ソケットを開いて…」</p >
c# - Lock() ステートメントから抜け出すとどうなりますか?
着信 TcpClient をリッスンし、着信時にデータを処理するプログラムを作成しています。Listen()
メソッドはコンポーネント内の別のスレッドで実行されるため、スレッドセーフである必要があります。ステートメント内でループbreak
から抜けた場合、ロックは解除されますか? そうでない場合、どうすればこれを達成できますか?do
while
lock()
ありがとう!
(非同期 TCP ソケットに関するその他のアドバイスも歓迎します。)
c# - .NET の recv に相当するものは?
C# に移植しようとしている C コードの一部があります。
私の C コードでは、ソケットを作成してから受信コマンドを発行します。受信コマンドは
現在、コマンド バッファーはcommand_buffer[8]
、文字列へのポインターであることを含む新しい値で返されます。
.NET でこれを行う方法について、私は本当に混乱しています。.NET の Read() メソッドは、char ではなくバイトを具体的に受け取るためです。重要な部分は、文字列へのポインターを取得することです。
何か案は?
ruby - Ruby バックグラウンド サービス
Rubyで書かれたTCPclientがあります。バックグラウンドで使いたい。現在、ループがあります:
だから私はクライアントを実行することができ、それは永久に機能します。
サービスとして実行し、pid をファイルに書き込む方法はありますか?
delphi - TCP \ IPを介してIndyでバイナリデータを送信するにはどうすればよいですか?
Indyコンポーネントでバイナリデータを送信するにはどうすればよいですか?このタスクに最も適しているのはどれですか?使ってみましたTIdTcpClient
が、文字列しか送れません。
ここでその問題に対する1つの応答を見つけましたが、わかりません。方法については書いてWrite(TIdBytes)
ありますが、答えはわかりません。彼は、のインスタンスに書き込むことを意味し、TIdBytes
そのインスタンスをどのように接続するかを意味しますTIdTcpClient
か?
助けてくれてありがとう。
c# - TCPClient アプリケーションの HttpTunneling
TCPClient を使用するカスタム チャット アプリケーション (c#) があります。ファイアウォールまたはプロキシの背後にあるクライアントで問題が発生しています。これらのクライアントは問題なくインターネットを閲覧できることがわかっているので、HTTP メッセージを使用して通信するように TCPClient アプリケーションを変更することにしました。
テキスト メッセージを標準の HTML タグと HTTP ヘッダーでラップするだけで十分でしょうか? 長く続くつながりが必要です。キープアライブに制限はありますか?ファイアウォールまたはプロキシには、「有効な」接続の時間制限がありますか。
c# - .NET NetworkStream が閉じられました。すべてのデータが読み取られたことを確認するにはどうすればよいですか?
TCP 接続を開いて、NetworkStream.BeginRead() を使用して読み取ります。いずれかの端で接続が閉じられると、コールバックが呼び出され、ストリーム オブジェクトは役に立たなくなります。ドキュメントにあるように、EndRead() は、この場合、接続を終了した端に応じて IOException または ObjectDisposedException をスローします。
最後に成功した EndRead (および再 BegingRead) と切断の間、特に最後にそれを行った場合、欠落しているデータがないことが保証されていますか? そうでない場合、接続を閉じている場合は、未読のものがないように切断するときに NetworkStream.Read() を手動で行う必要がありますか?