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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

UDP

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

Q&A

解決済

1回答

3176閲覧

RubyのUDP受信の並列処理について

miyazawa_shi

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

UDP

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

0グッド

0クリップ

投稿2017/04/05 10:26

udp受信の並列処理は可能?

以下のUDP受信プログラムを作成し,実行できることを確認しています。

ruby

1require 'socket' 2require 'ipaddr' 3 4udps = UDPSocket.open() 5udps.bind("0.0.0.0", 3610) 6mreq = IPAddr.new("224.0.23.0").hton + IPAddr.new("0.0.0.0").hton 7udps.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, mreq) 8 9loop{ 10 packet,adder = udps.recvfrom(65535) 11 p msg=packet.unpack("H*") 12} 13

上記プログラミングでは、loop処理で受信をし続けますが、
受信をしつつ、別の処理を同一のコード内で実現をしたい場合は、どのようなコードになりますか?

例えば、受信を継続しつつ、下記プログラミングの
puts "test"
が実行されるコードはどうすればよいですか?

ruby

1require 'socket' 2require 'ipaddr' 3 4udps = UDPSocket.open() 5udps.bind("0.0.0.0", 3610) 6mreq = IPAddr.new("224.0.23.0").hton + IPAddr.new("0.0.0.0").hton 7udps.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, mreq) 8 9loop{ 10 packet,adder = udps.recvfrom(65535) 11 p msg=packet.unpack("H*") 12} 13 14puts "test"

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

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

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

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

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

guest

回答1

0

ベストアンサー

スレッドを立てることで、並行実行できます(るりま)。

なお、マルチスレッドにする場合、いくつか制限があります。

  • スレッドの内外で普通の変数を使ってデータをやり取りしようとすると、データが壊れることがあります。ロックをかける、スレッドセーフなデータ構造を使うなどの対応が必要となります。
  • ふつうのRubyを使った場合、マルチスレッドでは、I/O待ち以外の部分では同時に1コードしか実行されません(もっとも、今回のようなサーバプログラムでは、I/O待ちだらけなので、特に問題はありません)。

ruby

1equire 'socket' 2require 'ipaddr' 3 4 5msg_thread = Thread.new do 6 udps = UDPSocket.open() 7 udps.bind("0.0.0.0", 3610) 8 mreq = IPAddr.new("224.0.23.0").hton + IPAddr.new("0.0.0.0").hton 9 udps.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, mreq) 10 loop{ 11 packet,adder = udps.recvfrom(65535) 12 p msg=packet.unpack("H*") 13 } 14end 15 16puts "test" 17 18# スレッドの終了を待つ 19# 待たないと、メインスレッドが終わるときに別スレッドも終了させられてしまう 20msg_thread.join

投稿2017/04/05 13:46

maisumakun

総合スコア145183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問