/var/log

技術系のあれこれ。※内容は個人の発言であり、所属する組織を代表するものではありません。

Boost::Asio

Snow Leopardの環境で C++ ライブラリである
Boost Library の Boost::Asio を使っていて事件が!!


32bitの頃には動いていたソースが64bitにすると動かない!?






...と思ってたら,内容がほぼ同じの別のソースコードは大丈夫だった.








ちょっと考えてみた.


今回の話題の中心となっているソースプログラムは
Boost::Asio をつかっての非同期通信式のHTMLサーバのプログラムです.

そして
問題が発生したのは endpoint の生成の部分でした.


accept 用のポートと
ソケットの対応関係を bind させる際にはendpoint を作る必要があります.


32bit の時には以下のソースでうまく動いていました.

boost::asio::ip::tcp::endpoint endpoint( boost::asio::ip::address_v4::loopback(), port_num );

このソースの意味は,
気分としては...「port_numポートとloopback()アドレスはセットね♪」という意味です.

loopback() は,ループバックアドレス(自分自身を示すアドレス)を返してくれるので
( http://e-words.jp/w/E383ABE383BCE38397E38390E38383E382AFE382A2E38389E383ACE382B9.html )

127.0.0.1

が返ってくるというのがこれまで(?)の僕の考えでした.

だから
自分自身の port_num ポートを endpoint に指定して
この endpoint に対してbind を行って listen してやれば
自分につなげようとしてくる輩を監視し,必要なら接続を許す!!

みたいな気分で使ってました.


これで今まで動いていたんだけどなぁ〜




しかし
どうもこれが原因で外部のアドレスに接続しに行けなくなってました.
( 127.0.0.1 から/への 接続のみ許すようになっていた)



なので
次のようにソースコードを変更しました.

boost::asio::ip::tcp::endpoint endpoint( boost::asio::ip::tcp::v4(), port_num );


こう書くことで
addr_anyな感じ(←どんな感じだよw)で
自分自身のポートに対してちゃんとバインドが行えるようになって
外部へも外部からも接続を受け付けるようになりました.





























...実は,いろいろ試しているうちに
正しいコードから誤ったコードにしてしまっていたというのは内緒の方向でwww