boost::asioでUDP/IP通信
C++でUDP/IP通信をやろう!
って思って、 http://www.geekpage.jp/programming/winsock/udp.php とか
http://www.geekpage.jp/programming/linux-network/udp.php とか
を見ながらシステムコールを実装してたんだけど、よく調べてみたらboostでもUDP/IPあつかえるじゃないか!
そういうことで簡単なメモ
まずは受信
#include <iostream> #include <boost/array.hpp> #include <boost/asio.hpp> using boost::asio::ip::udp; int main(int argc, char* argv) { try { boost::asio::io_service io_service; udp::socket socket(io_service, udp::endpoint(udp::v4(), 12345)); boost::array<char,2048> recv_buf; udp::endpoint remote_endpoint; boost::system::error_code error; size_t len = socket.receive_from(boost::asio::buffer(recv_buf), remote_endpoint, 0, error); std::cout.write(recv_buf.data(), len); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } }
次に送信
#include <iostream> #include <boost/array.hpp> #include <boost/asio.hpp> using boost::asio::ip::udp; int main(int argc, char* argv) { try { boost::asio::io_service io_service; udp::resolver resolver(io_service); udp::resolver::query query(udp::v4(), "localhost", "12345"); udp::endpoint receiver_endpoint = *resolver.resolve(query); udp::socket socket(io_service); socket.open(udp::v4()); std::string str = "HELLO"; socket.send_to(boost::asio::buffer(str), receiver_endpoint); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } }
非同期もできる。
#include <iostream> #include <boost/array.hpp> #include <boost/asio.hpp> using boost::asio::ip::udp; boost::array<char,2048> recv_buf; void receive(const boost::system::error_code&, std::size_t len) { std::cout.write(recv_buf.data(), len); } int main(int argc, char* argv) { try { boost::asio::io_service io_service; udp::socket socket(io_service, udp::endpoint(udp::v4(), 12345)); udp::endpoint remote_endpoint; boost::system::error_code error; socket.async_receive_from( boost::asio::buffer(recv_buf), remote_endpoint, &receive); io_service.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } }
これでマルチプラットフォームで動かせるってすごいね。
asioはシリアルポートにも対応しているみたい。知らずにAPI直接叩いて自作してたよ・・・後でこっちも試してみる。
参考: http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio.html
ところで、新しいブログ、スーパーpre記法には対応してないのかな。シンタックスハイライトできてないよ!
WYSIWYGなエディタが搭載されたというのに、ソースコード載せられないし、結局今までのはてな記法を使っている。
何とかして!
追記:
はてなブログのフィードバックを見るとスーパーpre記法のシンタックスハイライトには対応済みとなっている。
はてなダイアリーで全く同じ文章を投稿すると正しく表示されるから、記法を間違えたわけじゃないよな・・・。
http://d.hatena.ne.jp/shogo82148/20111123/1322062761
こちらの記事は書き込みテスト用ということで、本記事に対してコメントがある場合は上のリンクにお願いします。