問題タブ [recv]
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++ - TCP接続でのrecv()の問題
CのウィンドウでTCP通信をシミュレートしています。送信者と受信者が通信しています。
送信者は特定のサイズのパケットを受信者に送信します。受信者はそれらを取得し、受信した各パケットのACKを送信者に送り返します。送信者が特定のパケットを取得しなかった場合(パケット内のヘッダーで番号が付けられている場合)、送信者はパケットを受信者に再度送信します。受信側のgetPacket関数は次のとおりです。
firstTime
送信者が送信する通常のパッケージサイズを受信者が初めて知らないために使用するので、を使用してMAX_PACKET_LENGTH
パッケージを取得し、通常のパッケージサイズを受信したバイト数に設定します。 。
私の問題は最後のパッケージです。サイズはパッケージサイズより小さくなっています。つまり、最後のパッケージサイズが2で、通常のパッケージサイズが4であるとします。つまりrecv()
、2バイトを取得し、while条件を続行します。これにより、ループが再度繰り返され、送信者が送信するものがないためにブロックtotalChunkLen < packetSize
されているため、がスタックします。 。2<4
recv()
送信側では、ACKが返されなかったために接続を閉じることができないため、一種のデッドロックになります。受信者はさらにパッケージを待機しているためスタックしていますが、送信者は送信するものがありません。
recv()
タイムアウトを使用したり、パッケージヘッダーに特殊文字を挿入して、それが最後の文字であることをマークしたりしたくありません。
私に何ができる?
send - MPIで送受信するデータの最適なサイズ
私はMPIを使用して並列アプリケーションを作成しています。このアプリケーションでは、マスタープロセスに、各プロセスに送信するキャッシュ(作業中のプラットフォームでは4MB)とほぼ同じサイズのデータがあります。4MBはマスターが一度に送信するには大きすぎる可能性があるため、データ全体を送受信に適した特定のサイズの小さなチャンクに分割する必要があります。
私の質問は、データ全体のサイズを考慮して、それぞれの小さなチャンクを送受信するための最適なサイズについて何か提案はありますか?
ありがとう。
c++ - poll() は読み取り可能なデータにフラグを立てません
Bufferbloat プロジェクトに関連するネットワーク ベンチマークを作成しようとしています。ほとんどの場合は機能しますが、継続的に書き込まれているソケットに送信される 1 バイトのキャンセル信号を読み取るのに問題があります。
私の最初の試みは次のようなものでした:
Tcpdump は、クライアントによって送信された 1 バイトのパケットを示しましたが、サーバーはそれに応答しませんでした。奇妙なことに、クライアントを手動で終了すると、サーバーは「ハード シャットダウン」パスに到達せずにキャンセル パケットに応答します。
私の次の反復は、poll() を使用することでした。
これは、以前のコードと同じように動作しました。
どうすれば修正できますか?
python - Python ソケット recv からのデータの処理
データの受信に Python 2.7 ソケットを使用しています。
データから最初の unsigned short を取得するにはどうすればよいですか? データは次のようになります。
c++ - ソケット経由でオーディオファイルを受信する
Cのソケットからファイル(オーディオ、.CAF)を受信しようとしています(C ++ソリューションでも問題ありません)。文字列でテストして、ソケット通信を機能させています。私の問題は、recv(socket、buffer、buffer_size、0)の2番目の引数に何を提供するかわからないことです。どのタイプの「バッファ」を作成する必要がありますか?基本的にオーディオファイルを受け取り、再生します。しかし、オーディオファイル自体を受信する方法がわかりません。
何かご意見は?
ありがとう、
ロビン
c++ - epoll_wait 使用時にデータを正しく読み取る方法
IOCP を使用する既存の Windows C++ コードを Linux に移植しようとしています。epoll_wait
高い同時実行性を達成するために使用することに決めたので、受信したデータをいつ処理しようとするかという理論的な問題にすでに直面しています。
2 つのスレッドが を呼び出しepoll_wait
、Linux が最初のスレッドのブロックを解除し、すぐに 2 番目のスレッドのブロックを解除するような 2 つの結果メッセージを受信したとします。
例 :
このシナリオは考えられますか?つまり、それは発生することができますか?
recv/processing コードでの同期の実装を避けるために、それを防ぐ方法はありますか?
perl - socket->recv() 対 <>?
ソケットから 4 つの符号なし整数を読み取る必要がある小さな Perl 学習プロジェクトを実行しようとしています。1 つ以上の整数を読み取ることができませんでした。掘り下げた後、解決策を見つけました。しかし、私が正しくしなかったことを理解する必要があります (そして、何冊かの Perl の本、perldocs などを調べても無駄でした)。
例 1: 成功したソリューション コード (オリジナル) は次のとおりです。以下の両方でソケット接続が成功したと仮定します。
例 2: 以下で試してみました。アンパックする前に入力を出力すると、整数が 1 つしか得られません。
具体的な質問:
- 例 1 の "$/" は一体何ですか? そして、STDINを読んだと思った<>はどのように「変化」しますか?
- 例 2 では、recv() がソケットから複数の整数を取り出さない理由はありますか? 私の理解 (perldoc による) では、"SIZE" パラメータのデフォルトは "bytes" で、整数は 4 バイトですか?
ヘルプ、ポインタなどをいただければ幸いです。ところで、「学習プロジェクト」は overthewire.org です。かなりクールなものです。
c - select と recvfrom での予期しない結果
「タイムアウト」が発生する前に他のプログラムからこのプログラムにメッセージを送信しないと、select ステートメントが「失敗」するため、その中で recvfrom ステートメントを使用できません。私はかつて、他のプログラムが無限ループでこれに連絡するようにしましたが、if ステートメントの中に入ることはありませんでした。
何が機能するか: 各タイムアウトが発生する前にこのプログラムに連絡すれば、すべて問題ありません。recvfrom ステートメントを if(___ && select) の外に置くと、完全に正常に動作します。
以下は、このプログラムが Recv と呼ばれる小さな図です。
プログラムは A と B に正常に接続します //ループの開始に戻ります
これを投稿する 2 分前に、以前のコードを最後にもう一度確認することにしました。忘れたらしい
for ループ (tv.tv_sec = 1) の後。
なぜこれを行う必要があるのか 誰かが詳しく説明できますか?
python - Python: ソケット受信プロセスを停止する
socket-module 経由でデバイスからデータを受信します。しかし、しばらくすると、デバイスはパッケージの送信を停止します。次に、for ループを中断します。True は 100 を超えるパッケージを受け取るため、機能しません。このプロセスを停止するにはどうすればよいですか? s はソケットを表します。
編集: socket.settimeout() はソリューションの一部だと思います。参照: Python のソケット recv メソッドでタイムアウトを設定するには?
c - c recv()は改行が発生するまで読み取ります
私はCでIRCボットを作成しているところですが、問題が発生しました。
私の主な機能では、ソケットを作成して接続します。次に、サーバーから返送されているものを読み取るための(ほぼ)無限ループがあります。次に、読み取ったものをヘルパー関数に渡しますprocessLine(char *line)
。問題は、次のコードがバッファがいっぱいになるまで読み取ることです。改行(\ n)またはキャリッジリターン(\ r)が発生するまでテキストのみを読み取るようにします(したがって、その行を終了します)
結局、多くの行が一緒に詰まってしまい、それが発生したときに行を適切に処理できなくなります。
IRCプロトコルに精通していない場合、簡単な要約として、メッセージが送信されると、多くの場合、次のよう:YourNickName!YourIdent@YourHostName PRIVMSG #someChannel :The rest on from here is the message sent...
になります。たとえば、ログイン通知は次のようになります。:the.hostname.of.the.server ### bla some text bla
###はコード(? )処理に使用されます-つまり、372は、次のテキストがその日のメッセージの一部であることを示します。
すべてが詰まっていると、行の始まりや終わりがわからないため、どの行の番号が何であるかがわかりません。
これで助けていただければ幸いです!
PS:これはLinuxでコンパイル/実行されていますが、最終的にはWindowsに移植したいので、マルチプラットフォームで可能な限り多くのことを行っています。
PSS:これが私のprocessLine()コードです: