質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Q&A

解決済

1回答

5470閲覧

udp サーバにてタイムアウト処理をする

退会済みユーザー

退会済みユーザー

総合スコア0

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

0グッド

0クリップ

投稿2016/02/14 12:25

編集2016/02/14 20:55

UDPサーバにて複数のリクエストからタイムアウト処理を実行するにはどうしたらよいのでしょうか?

UDPにてヘッダ情報を受信後,その値を確認して返答します。
その返答を受信したクライアント側は,サイドデータ転送を実行し,そのパケットを受信したサーバ側はACKを返答します。
これが1クライアントに対しての処理で、これを複数クライアントから受信します。
そのため,クライアントの識別子をサーバ側でリスト構造にして保管しています。

ここでヘッダ情報を受け取り,返答した後に3secたったらサーバサイドに管理されていたそのクライアントのリストデータを削除しする...といったタイムアウト処理をサーバサイドに追加したいのです。
しかしノンブロッキングの状態でこの実装をする方針がわかりません.アラートで各クライアントごとに時間を計りシグナルを飛ばすのかなとも思いましたが果たしてそのようなことができるのでしょうか?
例えばクライアント1 のパケットを受信後 クライアント2のパケットが受信された、二人ともにレスポンスを送った。
その後3 秒応答がない、クライアント1 はタイムアウト。

ってなった時にどのようにクライアントを識別しつつシグナルを飛ばすのかがわからないのです.....
そもそのアラート等のシグナル関数は単一プロセスで複数回呼べるのでしょうか.....
実際に擬似コード等をご指摘いただけると参考になります.言葉だけでは私の理解力が追いつかない可能性がありますので。。。
よろしくお願いいたします。(なお、用いるのは UDP限定でよろしくお願いいたします。)

なおタイムアウトのケースは複数考えられますが,すべてクライアント側のタイムアウトとしてあつかっていいものとします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2016/02/14 12:36

UDPはパケットロスが起こりえます。クライアントからパケットが3秒以内に来ないのは、(1)クライアントが停止した等のクライアント側の問題、(2)サーバからクライアントに送ったAckが届かなかった、(3)クライアントからサーバに送ったサイトデータが届かなかった、といったケースが考えられます。(1)ならクライアントをタイムアウトにして良いのかもしれませんが、(2)(3)でクライアントをタイムアウトするのが妥当なのか疑問です。
guest

回答1

0

ベストアンサー

こんにちは。

シグナルを飛ばすと言うことは、たぶんLinuxでの話ですよね?
私はWindowsの人なのでLinuxは詳しくないため擬似コードは示せませんが、アイデアを。

もし、既にクライアント毎にスレッドを用意し、各クライアントからの受信待ちをrecvfromされているようなら、その前にpollを追加してタイムアウトを指定すると簡単と思います。
もし、スレッド1つで複数クライアント対応するために、受信待ちをpoll(もしくはselect)されているようなら、タイムアウトさせたいソケット毎にtimerfdを作ってそれも一緒にpoll(もしくはselect)すると良いように感じます。

投稿2016/02/15 00:58

編集2016/02/15 01:27
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問