[解決済み] ソケットライブラリでrecvを呼び出す場合、recvバッファはどの程度の大きさにすべきでしょうか?
質問
C言語のソケットライブラリについていくつか質問があります。以下は、私が質問で参照するコードのスニペットです。
char recv_buffer[3000];
recv(socket, recv_buffer, 3000, 0);
- recv_buffer の大きさはどのように決めればよいのでしょうか? 私は3000を使っていますが、これは任意です。
-
の場合、どうなるのでしょうか?
recv()
は、私のバッファよりも大きなパケットを受信しますか? - 受信するものがないのに recv を再度呼び出して永久に待たせることなく、メッセージ全体を受信したかどうかを知るにはどうしたらよいでしょうか。
-
バッファの容量が一定でない場合、容量不足を心配せずにバッファに追加し続けることができる方法はありますか?
strcat
を連結して、最新のrecv()
のレスポンスをバッファに保存しますか?
一度にたくさんの質問をしてしまいましたが、ご回答いただけると大変助かります。
どのように解決するのですか?
これらの質問に対する答えは、ストリームソケットを使用しているかどうかによって異なります (
SOCK_STREAM
) またはデータグラムソケット (
SOCK_DGRAM
TCP/IP内では、前者がTCP、後者がUDPに相当します)。
に渡されるバッファの大きさはどのようにして知ることができるのでしょうか?
recv()
?
-
SOCK_STREAM
: それはあまり重要ではありません。 もしあなたのプロトコルがトランザクション/インタラクティブなものであれば、合理的に期待される最大の個々のメッセージ/コマンドを保持できるサイズを選んでください(おそらく3000で大丈夫です)。 もしあなたのプロトコルが大量のデータを転送するものであれば、より大きなバッファがより効率的です。良い経験則は、ソケットのカーネル受信バッファサイズとほぼ同じです(多くの場合、256kB程度)。 -
SOCK_DGRAM
: アプリケーションレベルのプロトコルが送信する最大のパケットを保持するのに十分な大きさのバッファを使用してください。 UDPを使用している場合、一般的にアプリケーションレベルのプロトコルは約1400バイトより大きいパケットを送信するべきではありません。
以下の場合はどうなりますか?
recv
は、バッファより大きなパケットを取得しますか?
-
SOCK_STREAM
: ストリームソケットにはパケットという概念がなく、単にバイトの連続した流れだからです。 もし、バッファの容量以上のバイトを読み込むことができれば、それらはOSによってキューに入れられ、次のrecv
. -
SOCK_DGRAM
: 余分なバイトは破棄される。
メッセージをすべて受信したかどうかを確認するにはどうしたらよいですか?
-
SOCK_STREAM
: アプリケーションレベルのプロトコルに、メッセージの終わりを判断する何らかの方法を組み込む必要があります。 一般的には、長さのプレフィックス(各メッセージをメッセージの長さで始める)か、メッセージの終わりのデリミタ(例えばテキストベースのプロトコルでは単なる改行かもしれません)を使用します。 あまり使われていませんが、3つ目のオプションは、各メッセージのサイズを固定にすることです。 これらのオプションの組み合わせも可能です。たとえば、長さの値を含む固定サイズのヘッダーなどです。 -
SOCK_DGRAM
: シングルrecv
の呼び出しは常に1つのデータグラムを返す。
バッファの容量が一定でない場合、容量不足を心配せずにバッファを追加し続けることができる方法はありますか?
ただし、バッファのサイズを変更するために
realloc()
(で割り当てられていた場合)。
malloc()
または
calloc()
ということです)。
関連
-
警告:代入がキャストなしで整数からポインタを作成する場合の修正方法に関する警告
-
関数 'malloc' の暗黙の宣言に対する解決策
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
[解決済み] Code::Blocks アプリケーションをコンパイルできない
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み】インターネット上で最大の安全なUDPパケットサイズとは?