問題タブ [beginreceive]
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# - C# フォームで非同期クライアント ソケットを使用して送受信する
リモート サーバーに接続してログインし、C# フォーム アプリケーションを使用してデータを送信し、そこからデータを受信しようとしています。もともと私は正常に動作するコンソール アプリケーションを作成しましたが、フォームを使用する必要があります。問題は、フォーム アプリケーションのmy メソッドBeginSend
とメソッドが機能していないことです。BeginReceive
ソケットが最初にリモート サーバーに接続されたときに (正常に)、リモート サーバーからメッセージを受信しましたが、ConnectionStatusTest
ショーはまだ接続されています。しかし、データを送信する前に接続が切断されたようです。サーバーからの元のメッセージが (受信したい新しいメッセージではなく) 再び表示され、SendDataException
メッセージReceiveDataException
ボックスと が表示され、ConnectionStatusTest
接続されていないことが通知されます。
これが私のコードです:
BeginSend メソッドと BeginReceive メソッドが機能しない理由を解明するために多くの時間を費やしましたが、次の 2 つのうちの 1 つに絞り込んだと思います。
passText_KeyPress
関数では、 の部分data
がstring data = loginDetails
パラメーターとして関数に渡されませんSendData
。そのため、SendData
機能が正常に動作せず、SendDataException
が表示されます。loginDetails
これが問題である場合、関数に (または他の文字列を)渡すにはどうすればよいSendData
ですか?コンソール アプリケーションを使用して接続する場合、接続、ログイン、データの送受信に問題はなく、接続が切断されることもありません。しかし、telnet を使用して接続しようとすると、約 30 秒間非アクティブになった後、サーバーから「ホストへの接続が失われました」というメッセージが返されました。フォーム アプリケーションでも約 30 秒後に接続が切断されたように見えます。何らかの理由で、フォーム アプリケーションが接続されたことを通知するのに約 25 秒かかります。フォーム アプリケーションで KeepAlive を使用してみましたが、どうやらデフォルトの TCP キープアライブ期間は 2 時間です。これが問題である場合、これをたとえば 20 秒に変更するにはどうすればよいでしょうか? 私が読んだことはすべて、Visual Studioにファイアウォールを通過させるか(これを試しました-運が悪い)、レジストリキーを変更する必要があることを示唆しています。
エラー メッセージは「確立された接続がホスト マシンのソフトウェアによって中止されました」で、エラー コードは 10053 で、何らかの理由でタイムアウトになっていると思われます。もちろん、私は間違っているかもしれませんし、問題は私が見つけていない別の何かかもしれません。助けていただければ幸いです。ありがとう。
更新- 同期メソッドを使用してコードを書き直しました (5 秒ごとにまだ接続されているかどうかを確認できるように、タイマーを追加しました)。現在、2 つの異なるエラーが発生しています。
1 つ目は、「ノンブロッキング ソケット操作をすぐに完了できませんでした」と表示され、エラー コード 10035が生成されます。このエラーはReceive
、リモート サーバーに接続しているときにメソッドで発生します。バッファをクリアすると役立つかもしれないと思ったのですが、次に読もうとしたときに空白のメッセージが表示されるだけです。そのため、サーバーから実際に新しいメッセージを受信しているとはわかっていても、実際には受信していないとしか思えません。
2 番目は元のエラーです - 「ホスト マシンのソフトウェアによって、確立された接続が中止されました」、エラー コード 10053 - これは、Send
メソッドで 30 秒後に切断されたときに発生します。プロパティを変更すると役立つ可能性があることをさまざまな場所で読みましたが、メソッドの呼び出しの直前にそれをSocket.Blocking
作成しようとしましたが、どちらも役に立ちません。true
false
Receive
これを機能させる方法についてのアイデアはありますか?
改訂されたコード:
c# - BeginReceive を使用して別のクラスの別のメソッドにデータを返す
次のコードを使用して、 という名前のクラスで非同期にデータグラムを受信していますUDPComm
。私がすることは次のとおりです。
Manager
UDP接続を介してメッセージを送信する名前の別のクラスがありますUPComm.send(byte[])
UDPComm.startListening()
次に、メッセージをリッスンするために呼び出します。
receive()
私の問題は、メソッドで受信したバイトをManager
クラスに渡すにはどうすればよいですか? return を追加しようとしましたが、 でエラーが発生しudp.BeginReceive(receive, new object())
ます。
よろしくお願いいたします。
c# - ソケットが到着するすべてのパケットを読み取らない
私は C# TCP クライアントで作業しており、Microsoft Network Monitor を使用してパケットを監視しています。基本的にブラックボックスであるサーバーがあり、それぞれのパケットと次のパケットの間に 0.1 ミリ秒から 1 ミリ秒の遅延があり、N 個のパケット (現在は 10 ~ 20 のオーダー) を送信します。
TCP がストリームを受信するため、クライアントによって読み取られるパケットは順序どおりであり、もちろんほとんどがネットワーク モニターに表示されるよりも大きなチャンクで到着します。私の問題は、一部のパケットが到着しないことです (以前の情報のチャンクをチェックして、そこにないことを確認しました。それらは間違った順序で保存されていません)。
では、クライアントが何らかの形で情報の一部を欠落している可能性はありますか? パケットが頻繁に送信されていませんか? 残念ながら、私は彼らの頻度を改ざんすることはできません。ここにコードの一部を追加します。到着したパケットが読み取られない理由と、これを解決する方法について教えていただければ幸いです。
ここで、最初に BeginReceive を呼び出します。
これはコールバックです:
そして、これはEstaCompleto()
基本的にメッセージを変換してリストに追加する方法です。(実際にはif句に入れることを意図しているため、trueまたはfalseを返しますが、実際には何の役にも立たないこの問題を取り除くまで)
編集 25/3/15: MensajeRecibido クラスの残りの部分です。
string - UDP リスナー C# で受信した文字列に追加できない
UDP オブジェクトを作成するフォームがあり、UDP クラスで UDPClient が作成され、受信データは EndReceive を使用して BeginReceive メソッドで処理されます。
byte[] を変換した後、受信したデータの文字列を beginreceive メソッド内からテキストを追加してコンソールに出力すると、受信したデータのみが出力され、追加されたテキストは出力されません。
そのため、受信したデータが不完全なようです。
文字列が印刷されるとき、NewLine と追加された「done」は表示されません。
どんな助けでも素晴らしいでしょう!!
ありがとう
c# - Ansychronous Socket Client ReceiveCallback が実行されていません
こんにちは、以下のサンプル コードを使用して C# Winforms アプリケーションに取り組んでいます。
https://msdn.microsoft.com/en-us/library/bbx2eya8(v=vs.110).aspx
正しい IP アドレスとポート番号に接続しますが、文字列コマンドを送信して応答を待った後、ReceiveCallback が実行されていないためにアプリケーションが停止し、receiveDone ManualResetEvent が設定されません。100% 確実に応答が返ってくると思いますが、代わりにアプリケーションがスタックして ReceiveCallback メソッドを実行しません。ReceiveCallback メソッドが実行されない理由は何でしょうか?
コンテキスト: アプリケーションは、DC 電気トルク ツール コントローラーのインターフェイスです。コントローラーの IP アドレスとポート 4545 に接続し、Open Protocol コマンドを送信して設定を変更できます。
c# - Python Twisted frameowrk transport.write to ac# socket BeginReceive 長さベースのメッセージ フレーミング値を読み取る
BeginRecieve 非同期読み取りを実行している C# クライアントを使用して、Python ツイスト フレームワークで長さベースのメッセージ フレーミングを使用していますが、メッセージの長さの値を取得するのに問題があります。
これはねじれた python コードです
self.transport.write(pack(self.structFormat, len(文字列)) + 文字列)
これは C# コードです。
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0) { int msg_size = BitConverter.ToInt32(state.buffer, 0);
問題は、C# 側で Bitconverter を介して取得すると、len(string) の値が正しくないことです。値は 15 のはずですが、251658240 になります。
どんな洞察も大歓迎です。