問題タブ [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 - 'sendfile'で送信されたファイルをどのように受信しますか?
基本的なファイルサーバーを実装しようとしています。私はここにあるsendfileコマンドを使おうとしています:http://linux.die.net/man/2/sendfileTCPを使用しています。
正常に送信することはできますが、バイナリで送信するため、ハングアップするかどうかはわかりません。
recvでファイルを受信しようとしていますが、正しく送信されません。バイナリファイルを受け取り、それを文字列に入れる特別な方法はありますか?
編集:いくつかのコードを提供するように求められました、ここにあります:
SENDFILE呼び出し(サーバープロセスから)
RECIEVE呼び出し(クライアントプロセスから、ループよりもさらに基本的で、1文字だけが必要です)
編集:戻り値をチェックするためのコードを書きました。sendfileはerrno9を与えています-不正なファイル番号。これは、呼び出しの2番目のファイル記述子(送信するファイルの記述子)にあると想定しています。sendfileがintではないと文句を言っていたので、intとしてキャストしました。
上記のsendfile呼び出しで使用したファイルポインタコードを指定して、send fileをどのように使用する必要がありますか?
http - Berkeley Sockets で不明なサイズの recv() データ
リモート ホストからデータを受信するために Berkeley Sockets の recv() を使用する C++ のコードがあります。問題は、データのサイズ (可変) がわからないため、これを機能させるには何らかのタイムアウト オプション (おそらく) が必要です。
私はソケットプログラミングが初めてなので、たとえばWebクライアントがサーバーからの応答をどのように処理するのか疑問に思っていました(たとえば、サーバーはhtmlデータをクライアントに送信します)。ページの大きさがわからないので、ある種のタイムアウトを使用しますか? FTP クライアントと同じです。
c - recv() の遅延
ソケットプログラミングを使用して通信する2つのプログラムがあります。最初に番号を指定します。相互にメッセージを交換する必要がある回数に関するホップ数。メッセージを受信するたびに、その ID が追加されます。したがって、文字列は毎回サイズが大きくなります。私のプログラムは 8000 ホップまで正常に動作していますが、8000 ホップを超えた後、プログラム p1 は長さ 16388 の文字列を送信しますが、p2 は、ソケットに 16385 しか読み取れないことを識別します。ioctl() を使用して、ソケットで recv() の準備ができている文字の量を決定し、それを char * 変数で recv します...
p1 の send() と p2 の recv() に遅延があるため、 p2 は socket で 16385 文字しか識別しないのでしょうか?
例: P1 が長さ (16388) を送信する場合
P2 は次の長さ (16385) のみを受け取ります
sockets - パフォーマンスを向上させるためにノンブロッキング ソケットをポーリングする必要がありますか?
ノンブロッキング ソケットのリストがあります。
それぞれ (この場合、いくつかの呼び出しrecv
は失敗します) またはpoll
リストを呼び出しrecv
て、後で準備ができているソケットを呼び出すことができます。
これらのアプローチの間にパフォーマンスの違いはありますか?
ありがとう!
c - socket.hのrecv()のセグメンテーション違反
のrecv()関数を実行すると、奇妙なセグメンテーション違反が発生しました。これが私のコードでrecv()を使用した関数です。
この問題の最も奇妙な部分は、セグメンテーション違反が毎回発生するわけではないということです。通常、受信を100回または200回行った後(場合によってはそれ以下)。そして、それが起こったとき、プログラムは「endrecv()」なしで私の「startrecv()」文だけを出力します。
したがって、問題はrecv()関数で発生すると思いますが、これを修正する理由と方法を理解できませんでした。
linux - TCPメッセージフレーミング+recv()[linux]:良い慣習?
Linuxでp2pアプリケーションを作成しようとしていますが、これをできるだけ効率的に実行したいと考えています。
私が抱えている問題は、パケットの管理にあります。ご存知のように、recv()バッファには常に複数のパケットが存在する可能性があるため、複数のパケットが1つの大きなパケットとして扱われないようにするために何らかのメッセージフレーミングシステムが必要です。
したがって、現時点での私のパケット構造は次のとおりです。
これには、recv()を2回呼び出す必要があります。1つはパケットサイズを取得し、もう1つはパケットを取得します。
これには2つの主な問題があります。
最高の効率と安定性の両方のためにパケット/受信システムを構築するための最良の方法は何ですか?他のアプリケーションはどのようにそれを行いますか?おすすめは何ですか?
前もって感謝します。
c++ - WinSock2: recv と send を使用して、受け入れられた着信接続を別々のスレッドで処理する
WinSock2を使用して、クライアントからの複数の特定の HTTP 要求を処理する Windows ベースの Web サーバーを実装しています。サーバーを起動および停止するクラスがあります。次のようになります。
ここTLM_ERROR
で、サーバーのエラー列挙の型定義です。
bool CMyServer::Start()
メソッドはサーバーを起動し、構成されたポートでリッスンするソケットを作成し、DWORD CMyServer::Run(LPVOID)
ここで説明するように着信接続を受け入れる別のスレッドを作成します。
::accept(...)
で着信クライアント接続を待機するために使用しCMyServer::Run(LPVOID)
、新しい接続が受け入れられた後、別のスレッドを作成してクライアントからデータを受信し、スレッド関数の引数の一部としてCMyServer::ProcessRequest(LPVOID)
返されたソケットを渡す応答を送信します。::accept(...)
この実装を手動でテストすると、望ましい結果が得られます。しかし、JMeterによって生成された複数のリクエストを送信すると、そのうちのいくつかが .NET によって適切に処理されていないことがわかりますDWORD CMyServer::ProcessRequest(LPVOID)
。によって作成されたログ ファイルを見ると、ProcessRequest
10038 WinSock エラー コード(非ソケットで呼び出しが試行されたことを意味する::recv
)、10053 エラー コード (ソフトウェアが原因で接続が中止された)、さらには 10058 エラー コード (ソケットのシャットダウン後に送信できません) を特定できます。しかし、10038 番目のエラーは、他の人が言及したよりも頻繁に発生します。
ソケットが何らかの理由で閉じられたように見えますが、後で閉じて、 で::recv
呼び出さ::send
れましたProcessRequest
。また、 ::_beginthreadexの代わりに::CreateThreadを使用することに関連する問題である可能性があると考えましたが、メモリリークにつながる可能性があるだけです。ここで説明されている方法でメモリリークが検出されていないため、それが理由であることに疑いがあります。さらに、スレッドが終了するのを待つために::WaitForMultipleObjectsで使用できるハンドルを返します。これは、サーバーを適切に停止するために必要です。::CreateThread
これらのエラーは、クライアントが応答を待ちたくないために発生する可能性がありますか? 私はアイデアがありません。私が見逃していること、または行っていること/理解が間違っていることを教えていただければ幸いです。ちなみに、サーバーも JMeter もローカルホスト上で動作しています。
最後に、ProcessRequest
メソッドの実装を次に示します。
c - スレッド内のソケット recv、間違った動作
挨拶 !!
私はソケットサーバーとして開発されたLinuxでunpv13eライブラリを使用し、(最大で)3つのソケットクライアントを受け入れるポートをリッスンします。各クライアントには独自のスレッドがあります....
これらの 3 つのクライアントは非常に迅速に送信しますが、ソケット サーバーの recv 関数は、文字列の半分が client1 からのものであり、別の半分が client2 からのものであると受け取ります。ソケットIDが違うので、なぜそうなったのか興味がありますか? 次のコードで説明させてください。
unpv13e ライブラリの readline 関数は recv を呼び出し、'\n' になるまで一度に 1 文字ずつチェックして戻ります。nread は通常 315 バイト程度で、このソケット サーバーに send がありません!! 私の意見では、web_child 関数は異なる socketfd で thread として実行され、行は local var であるため、3 つの異なるクライアントが互いに影響を与えることはありません。ソケット client1 は常に "101" で始まる文字列を送信し、client2 は常に"201" を送信、client3 は "301" を送信 ....
しかし、 Do101(line) に文字列が表示されることがあります。最初の半分は "101" で、後半は client2 から来ています。これらの 3 つのクライアントが非常に頻繁に送信すると、互いに影響します。 、それは起こるかもしれません...あまり頻繁ではありませんが、ただ起こったのです!!
コードにどのようなバグがありますか? 異なるスレッドの異なる socketid からの recv は互いに影響しますか?
どんな提案でも大歓迎です!! ありがとう !!
c++ - winsock - recv - ネットワーク接続の問題
私の C++ アプリケーションでは、recv
関数をループで使用しています。recv 関数から負の値を取得して、ネットワーク接続の問題を特定したいと考えています。
私のテストで確認できることの 1 つは、ネットワーク ケーブルを外したときに、アプリケーションがこの負の値を取得したことを確認できるまで 1 分ほど待つことができるということです。
ネットワーク接続の問題が発生したことを C++ コードが認識するまでの時間はどれくらいか知っていますか? 今回はなんとかなるかな?
c++ - TCPに準拠したC++関数
ネットワークの問題を示すためにrecv関数(C ++)を使用しています(この場合は負の値を返します)
ここを見てください:https ://www.rfc-editor.org/rfc/rfc1122#page-100 TCP接続障害で、R1とR2があることがわかります。
R1は、TCPがアプリケーションに問題があることを通知するときです。R2は、接続が閉じられたときです。
「R1の値は、現在のRTOで少なくとも3回の再送信に対応する必要があります。R2の値は少なくとも100秒に対応する必要があります。」</p>
RTO(再送信タイムアウト)は通常3秒で開始するため、R1の場合は約10秒後になる可能性があります。
私が理解している限り、受信機能はR2について教えてくれます。C ++アプリケーションでR1を取得する方法を知っていますか?
10倍。