Title

2014年1月の投稿一覧

iOSでSMBライブラリを実装する(その6)

そろそろメモとして書くことがなくなってきました。
一応リリースできましたしね。
SMBは「シンプルの逆」のものなので、完全な互換性を目指すとかなり茨の道を行くことになります。

最後に、ものすごく参考になりそうな本をみつけたのでご紹介。

Implementing CIFS: The Common Internet File System

cifsimp

タイトルまんまですね。
最初に存在を知っていれば・・・ということはよくあります。
ここに辿り着いただけでも褒めてください。

さて、実用としては色々考えるところもありますが、やっぱりSambaのスケールの大きさとか、市販のCIFSライブラリが長年開発されて売られ続けていることとか、使いやすいライセンスの優れたOSSがみつからないとか、ようするにSMBは複雑ってことですね。

SMB初期実装をリリース

さて、せっかく作ったのでComicGlassのSMB対応バージョンをリリースしました。

予想はしていましたが、いくつか互換性で問題が発生しています。
Windows,Samba,MacはチェックしていたのでOKだったのですが、Sambaのバージョンが古いもの、もしくは設定がちょっと古風になっているもの、あとWindowsでもSambaでもMacでもないもので問題がおきました。

一つ目は、パスワードが設定されていないNAS(WindowsはOK)に接続したとき、ストリーミングすると落ちます。
これはプロトコルの解釈というよりは、単純に値の受け渡しミスでした。
内部的にユーザー名とドメインをつなげて指定できるようにしていたのですが、空だとnilになって文字列のパースで落ちます。
こちらは1行修正するだけなので、すぐに修正版出せる予定です。

2つ目はAirMac Time Capsuleです。
こちらも想定どおりといえば想定どおりなのですが、認証方式の問題で接続がうまくいきません。

具体的にはAirMac Time Capsuleでは「Extended Security Negotiation」フラグがオフになっています。

airmac

手元で事前に試した限り、Extended Security Negotiationを使わないデバイスはなかったので、省力化のために実装を省きました。
しかし身近なところにありました。

Extended Security Negotiationがオフの場合でも認証なしの場合のみ対応していたのですが、AirMac Time Capsuleは認証も要求するのでダメです。はい。

他にも、なにかと互換性の問題が起きる可能性は否定できず(なにせSMBはとても歴史あって方言の多いプロトコルなので・・・)、根本的な対策ができたらなと思ってるところです。
(決まりましたらお知らせします)

AirMac Time Capsuleの対応についてはしばらくお時間ください。

iOSでSMBライブラリを実装する(その5)ホストの検出(ブラウジング)

Windowsでマイネットワークを開くと近くのコンピュータが自動的に表示されます。
これは単純にブロードキャストしてそれぞれが応答をするのではなく、バックアップブラウザを持っているホストに問い合わせをすることで実現しています。

バックアップブラウザはLAN上のコンピュータが自動的に選定されて、どれかがなります。
OSのバージョンによって優先度が決まっていたりしますが、問い合わせるだけなのでその部分はあまり気にしないことにします。

さて、これを実装しようとすると結構面倒で、

1.バックアップブラウザの検索
2.バックアップブラウザからブラウザリスト(ホスト一覧)の取得
と2段階を踏む必要があります。

1はブロードキャストで問い合わせ(GetBackup Request)をすると、バックアップブラウザが応答(GetBackup Response)を返してくれます。
ここで一つ重大な問題があります。

問い合わせは当然ながらIPで行っているわけですが、元はNetBIOSのため、バックアップブラウザが自分に対して応答を返すときに、名前解決を要求してきます。
よってNBNSの問い合わせに応答できるように実装しておかなければなりません。
(IPで送ってるんだからそのアドレスに返してよ・・と思いますがそうはなっていません)

これは本来であればOSの機能なので、アプリで実装してしまうと、他のアプリと同時にポートをBINDしたときに問題が起こりそうですね。

次に2ですが、これはSMBと同じです。
しかし、ダイレクトホスティング(ポート445番)では挙動が不安定でした(Windows7で確認)。
ちゃんとNetBIOSセッションサービスを利用すると安定して取得できます。謎です。

さて、この方法ですと、ワークグループ名の指定が必要です。
また何かしらの理由でバックアップブラウザが存在しないとホスト一覧を取得できません。

以下は禁じ手だと思うのですが、GoodReaderの実装がそうなっていたので紹介しておきます。
確実な方法ですが、ポートスキャンがちょっと攻撃っぽいので今のところComicGlassでは非採用にしました。

1.ネットワークのサブネットマスクからネットワークアドレスとホストアドレスを分離します。
2.全てのホストアドレスのTCP/445番ポートに対して接続を試みます。(つまりポートスキャン)
3.接続できたら、セッションセットアップの途中までやります。途中というのは相手のホスト名が判明するところまでです。(認証の途中)
4.ホスト名(NetBIOS名)が取得できたら切断しちゃいます。

とりあえず上記の方法であればブラウジング機能に頼らずホストを検出できます。ただし同じサブネットの中のみ。
(ポートスキャンしているから当然といえば当然ですが・・・)

iOSでSMBライブラリを実装する(その4)~あると便利なもの

今回はただの愚痴ですが・・・。

SMB/CIFSの仕様をみると、データの途中にいきなり可変長データが入っていたりします。
さらにpaddingがいたるところに出てきます。

また、変数は存在するものの、実際のところどういう値にしていいのか、定数としてどんなものがあるのかわからないことが多々あります。

そんなときはプロトコルアナライザです。
WindowsServer系ならばリソースキットで利用できますが、WireSharkなんかも便利です。

そして、絶対あったほうが良いもの・・。

それはポートミラーリング、またはポートモニタリング機能がついたスイッチングハブです。
完全なリピータハブがあればそれでもいいですが、おそらく10BASE-Tの時代のものしか無いと思うので・・・。

数年前までは何万円もしましたが、今では1万円を切る商品もあるみたいです。

カレンダー

2014年1月
 12345
6789101112
13141516171819
20212223242526
2728293031  

▲Pagetop