[解決済み] Linux: ソケットからの読み込みや読み込みがタイムアウトすることはありますか?
質問
タイムアウトしたソケットからデータを読み込むにはどうしたらよいでしょうか。 select, pselect, pollにタイムアウトフィールドがあるのは知っていますが、これらを使用するとtcp reno stackの"tcp fast-path"が無効になってしまいます。
私が持っている唯一の考えは、ループで recv(fd, ..., MSG_DONTWAIT) を使用することです。
どのように解決するのですか?
あなたは setsockopt 関数を使用して、受信操作のタイムアウトを設定することができます。
SO_RCVTIMEO
入力の最大時間を指定するタイムアウト値を設定します。 入力関数が完了するまでの最大時間 関数が完了するまで待機する時間の最大値を指定します。これは を含むtimeval構造体を受け取ります。 秒数およびマイクロ秒数 を指定する。 入力操作が完了するまで待つ時間の制限を指定する。 を受け取る。受信動作がこの時間 受信動作がこの時間だけブロックされ 受信動作が追加データを受信せずにこの時間ブロックされた場合,その動作は 部分的なカウントまたは errno で戻る。 を[EAGAIN]または[EWOULDBLOCK]に設定し、データを受信しない場合は を設定する。このオプションのデフォルトはゼロである。 このオプションのデフォルトは0であり,これは受信動作がタイムアウトしないことを示す。 受信動作はタイムアウトしてはならない。 このオプションは、timeval 構造体を取る。 すべての実装でこのオプションの設定が可能なわけではないことに注意 はこのオプションの設定を許可していないことに注意してください。
// LINUX
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
// WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
// MAC OS X (identical to Linux)
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
報告されている
を呼び出す前に行う必要があります。
bind
. 私は実験によって、この処理は
bind
の前でも後でもできることを実験で確認しました。
関連
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
警告:代入がキャストなしで整数からポインタを作成する場合の修正方法に関する警告
-
ポインタ定数および定数ポインタ
-
未定義の `__isoc99_sscanf' への参照
-
C/C++の再定義
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] C言語で "unsigned long "をprintfする方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
C++の配列コピー
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] C言語で "unsigned long "をprintfする方法は?