問題タブ [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メッセージ通信
こんにちは私はtcp接続を使用してメッセージを送信/受信したいと思います。問題は、多くのメッセージを送信してレイテンシーを測定したいということです。したがって、メッセージが送信されるたびに受信したくありません。ただし、着信メッセージを時間内に処理しないと、プログラムは常に予期しない結果を受け取ります。msgを送信するプログラムをブロックせずにrecv()を処理できる方法はありますか?コメントをいただければ幸いです。
c - 複数の recv() 呼び出しと考えられるすべてのシナリオの処理
私はCとTCPサーバーの作成にかなり慣れてrecv()
いないため、サーバーが応答するコマンドを送信するクライアントからの s を処理する方法を考えていました。この質問のために、ヘッダーが 1 番目のバイト、コマンド識別子が 2 番目のバイト、ペイロードの長さが 3 番目のバイトであり、その後にペイロード (存在する場合) が続くとしましょう。
recv()
このデータへの最善の方法は何ですか? 最初の 3 バイトをバッファーに読み込むために呼び出しrecv()
、ヘッダーとコマンド識別子が有効であることを確認してから、ペイロードの長さを確認recv()
し、ペイロードの長さを長さとして再度呼び出し、これを前述のバッファーの後ろに追加することを考えていました。ただし、 Beej のネットワーキングに関する記事 (特に「Son of Data Encapsulation 」セクション) を読んで、次のパケットの一部を取得するなどの状況を処理するには、「2 つの [最大長] パケットに十分な大きさの配列」を使用するようアドバイスしています。
これらのタイプの を処理する最善の方法は何recv()
ですか? 基本的な質問ですが、発生する可能性のあるすべてのケースを処理して、効率的に実装したいと思います。前もって感謝します。
c++ - 一部のデータを受信していない recv
次の問題があります。コードのチャンクは次のとおりです。
ただし、recv
データ全体ではなく (データ長は常に 未満sizeof(temp)
)、その一部のみを返す場合があります。書き込み側は常にデータ全体を送信します(スニファーで取得しました)。どうした?どうも。
PS私は知っています、良いマナーは私にチェックするように勧めますn
(if (n < 0) perror ("error while receiving data")
)、しかしそれは今は問題ではありません-それは私の問題の理由ではありません.
PS2忘れました-ソケットをブロックしています。
sockets - epoll_wait() が 2 回閉じられたソケットを受け取る (read()/recv() は 0 を返す)
epoll を使用して http 接続をリッスンおよび処理するアプリケーションがあります。epoll_wait() は fd でクローズ イベントを「行」で 2 回受け取ることがあります。意味: epoll_wait() は read()/recv() が 0 を返す接続 fd を返す(socket) は、初回はクローズとして検出されます。2回目はクラッシュ。
この問題は、実際の使用ではめったに発生しません (サーバーごとに実際に約 500 ~ 1000 人のユーザーがいる 1 つのサイトを除く)。1秒あたり1000を超える同時接続でhttp siegeを使用して問題を再現できます。この場合、アプリケーションは (無効なポインタが原因で) 非常にランダムに、時には数秒後、通常は数十分後にセグメンテーション違反を起こします。1 秒あたりの接続数を減らして問題を再現できましたが、そのためにはアプリケーションを長時間、何日も、何週間も実行する必要があります。
すべての新しい accept() 接続 fd:s は非ブロッキングとして設定され、ワンショット、エッジ トリガーとして epoll に追加され、read() が使用可能になるのを待ちます。では、サーバーの負荷が高い場合、epoll はアプリケーションが close-event を取得できなかったと判断し、新しいイベントをキューに入れるのはなぜでしょうか?
epoll_wait() は独自のスレッドで実行され、別の場所で処理される fd イベントをキューに入れます。epoll から同じ fd にイベントが 2 回続けて発生するかどうかをチェックする単純なコードで、複数のクローズが着信していることに気付きました。それは起こり、両方が閉じるイベント(recv(..、MSG_PEEK)が私にこれを伝えました:))。
epoll fd が作成されます:
p>epoll_wait() は次のように実行されます:
p>新しい fd は、accept() の後に非ブロッキングとして設定されます:
新しい fd が epoll に追加されます (クライアントは malloc:ed 構造体ポインターです):
そして、fd からデータを受信して処理した後、(もちろん EPOLLONESHOT 以来) 再武装されます。最初は、エッジ トリガーとノンブロッキング io を使用していませんでしたが、テストしたところ、それらを使用してパフォーマンスが大幅に向上しました。ただし、この問題はそれらを追加する前に存在していました。ところで。shutdown(fd, SHUT_RDWR) は、他のスレッドで使用され、サーバーが http エラーなどのために fd を閉じる必要があるときに、epoll を介して適切な閉じるイベントをトリガーします (これが正しい方法であるかどうかは実際にはわかりません)。実行しますが、完全に機能しています)。
c++ - recv() の EAGAIN
カメラからビデオを取得するために、HTTP経由でRTSPを使用してIPカメラと通信するソケットクライアントを実装しました。
カメラとの通信を安定させるには、まず HTTP-GET トンネルを設定し、次に RTSP コマンドを送信する必要があります。カメラが接続を失うと、プログラムはトンネル ハンドラーを閉じてスレッドを終了し、プロセスがメイン関数に戻ると通信を開始する必要があります (トレッドの開始など)。
再接続時: http-get トンネルは正常に設定されています。つまり、ソケットが接続して "HTTP OK" を受信するため、プログラムは RTSP "DESCRIBE" を送信しますが、recv は常に EAGAIN エラーを返します。カメラから DESCRIBE OK 応答が送信されていることを確認しますが、recv はそれを取得しません。
コードは次のとおりです。
タイムアウトの問題でしょうか?またはスタックの問題?どうすれば解決できますか?
よろしくお願いします。よろしくお願いします。
クリスティーナ
linux - EBADF while recv after epoll_wait
次の問題があります: 接続を受信する epoll コードがあります:
入力接続を受け取ったとき、すべてのバフデータを読み取ろうとしています:
関数内accept_request
。しかし、デバッグ出力で次のようになることがあります。
これは、誰かが切断されたよりも先に接続され、再度接続しようとするとrecv
が返されることを意味しますEBADF
。私は何を間違えましたか?私を助けてください。
PS on EPOLLRDHUP
i はファイル記述子を閉じるだけです。男は、閉じた fd をキューから単独で削除するepoll
ので、大丈夫だと言います。epoll
epoll_wait
c++ - C++ recv winsocket2 による HTTP キープアライブ
私は自分の HTTP fetcher ソケットをコーディングしています。私は MVC++ と winsocket2.h で C++ を使用しています。ソケットをプログラムして、必要な Web サイトのサーバーに接続し、HTTP GET 要求を送信することができました。
問題は、キープアライブ接続で HTTP GET 要求を送信した後、recv 関数を呼び出すことです。Web サイトを取得した後を除いて、問題なく動作し、サーバーまたは接続からのタイムアウトのヒントを待ち続けます。閉じる!!
これは、サーバーのキープアライブ タイムアウトに応じて数秒かかるため、キープアライブ HTTP 設定の恩恵を受けられません。
Web サイトを取得した後に recv 関数を停止するように指示し、コマンドを返して、別のハンドシェイク体制を回避しながら別の HTTP 要求を送信できるようにするにはどうすればよいでしょうか。
ノンブロッキング ソケットを使用すると、より高速に動作しますが、停止するタイミングがわかりません。str.rfind("",-1,7) を設定して、データの取得を停止します。ただし、あまり効率的ではありません。
誰かがそれを行う方法を知っていますか、または接続が維持されているときにHTTPサーバーによって送信される最後の文字は何ですか?それで、停止の決定として使用できます.
ベスト、
萌え
c - recvfromの呼び出し後にソケット記述子が変更されました
編集:このプロジェクトが再び与えられ、学生がこの投稿を介して解決策を簡単に見つけることができるため、コード/説明を削除しました。
何が起こったのかを明確にするために、recvfrom()呼び出しで間違った長さ/サイズを渡しただけです。
c - recv は pcaps バッファからパケットを削除しますか?
コンピューター上で実行されている 2 つのプログラムがあるとします (単純化のために、Linux で実行されている唯一のユーザー プログラム)。そのうちの 1 つは recv() を呼び出し、もう 1 つは着信パケットを検出するために pcap を使用しています。パケットが到着し、pcap を使用するプログラムと recv を使用するプログラムの両方によって検出されます。しかし、これら 2 つのうちの 1 つがパケットを取得できない場合 (たとえば、recv() が pcap_next() への呼び出しの間に戻る) はありますか?
ここでバッファリングシステムがどのように機能するか本当に理解していないので、より詳細な説明が必要です-これらのプログラムの1つがパケットを認識し、他のプログラムが認識しないという考えられるケースはありますか? もしそうなら、それは何であり、どうすればそれを防ぐことができますか?
c++ - 問題: recvmsg(pfd[0], &message, MSG_WAITALL) は、ブロックされる代わりに常に -1 を返しますか?
接続時に (フォークを使用して) 子を生成し、別の接続が入ってくると、パイプを使用してこの子に別のソケットを送信するサーバーを作成しています。プレーヤー ネットワーク ゲーム モード。
親と子の間の IPC パイプ変数は pfd[2] です。
基本的に、子プロセスではrecvmsg(pfd[0], &message, MSG_WAITALL)
、親プロセスから 2 番目のソケットが渡されるのを待ちます。
ただし、recvmsg がブロックされることはなく、常に -1 が返されます。
次のように、すでに pfd[0] を BLOCKING に設定しています。
子を recvmsg でブロックするにはどうすればよいですか?
ヒントをありがとう。