2

私はiPhoneを使って自分のWindows共有フォルダにアクセスする方法を見つけようとしています。必要な機能は、私が構築しているより大きなエンタープライズアプリの一部です。すでに同様の質問をしているが運がない人がいます-iOSはSMBを介したファイル操作をサポートしていますか?

今、私は「SimpleNetworkStreams」と呼ばれるアップルデベロッパチュートリアルを見つけました。これは、NSNetServiceインスタンスのタイプをプロトコルに設定することにより、tcpを介してx-SNSUploadプロトコルを使用するためにNSNetServiceを使用しますx-SNSUpload._tcp

これが彼らがそれをどのように行ったかです-

self.netService = [[[NSNetService alloc] initWithDomain:@"local." type:@"_x-SNSUpload._tcp." name:@"Test"] autorelease];

したがって、MacBookでSMBサーバーに置き換え_x-SNSUpload._tcpて実行するとします。_smb._tcp次の一連のコマンドを実行して、MacBookでSMBを起動します

dns-sd -R Test _smb._tcp. "" 12345

nc -l 12345 > tmp.png

次に、iPhoneの画像をMacBookのルートディレクトリに転送できます。私はWindowsマシンの共有フォルダでも同じことをしたいと思っていました。

共有フォルダの名前は「テスト共有」です。私は自分のWindowsマシンの「テスト共有」フォルダをすべての人に完全に制御して明示的に共有しました。コードの完全な詳細は以下に記載されています(更新後)

ブラウザで「smb:\\ 10.212.19.121」と直接入力すると、共有フォルダにアクセスできます。ファインダーアプリケーションが開き、「一時共有」フォルダーをマウントするオプションが表示されます。


更新-上から取り出された多くの冗長なテキストと、SimpleNetworkStreamsがどのように機能するか、そして私が微調整したことの詳細を以下に示します。

コードは-SimpleNetworkStreams-から取得されます

  1. 送信するファイルのタイプNSInputStreamのストリームを開きます
//Open a stream for the file we're going to send

//filepath is a NSString with path to the file on iPhone

self.fileStream = [NSInputStream inputStreamWithFileAtPath:filepath]; 

assert(self.fileStream != nil); 

[self.fileStream open];
  1. アップルのドキュメントが言うように

「NSNetServiceオブジェクトを直接作成するか(正確なホストとポートの情報がわかっている場合)、NSNetServiceBrowserオブジェクトを使用してサービスを参照できます。」

NSNetServiceのオブジェクトは、SMBサーバーをホストするサーバーに対してインスタンス化されます

// Open a stream to the server, finding the server via Bonjour.  Then configure 
// the stream for async operation.

//here's the tweak.
//original code looked like - 
//self.netService = [[[NSNetService alloc] initWithDomain:@"local." type:@"_x-SNSUpload._tcp." name:@"Test"] autorelease];

self.netService = [[[NSNetService alloc] initWithDomain:@"10.212.19.121" type:@"_smb._tcp." name:@"lanmanserver"] autorelease];

assert(self.netService != nil);

NSDictionary *newDict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:@"domain\\username",@"password",@"C:\\Documents and Settings\\username\\Desktop\\test%20sharing",nil] forKeys:[NSArray arrayWithObjects:@"u",@"p",@"path",nil]];

[self.netService setTXTRecordData:[NSNetService dataFromTXTRecordDictionary:newDict]];
 

NSOutputStream型の出力ストリームオブジェクトをself.networkStreamに取得します。

success = [self.netService getInputStream:NULL outputStream:&output];
assert(success);

self.networkStream = output;

[output release];

self.networkStream.delegate = self;
[self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[self.networkStream open];

次に、NSOutputStreamデリゲートがNSStreamEventHasSpaceAvailableをキャッチし、入力ファイルをバッファリングしてから、そのバッファをNSOutputStreamオブジェクト(networkStream)に書き込みます。

bytesWritten = [self.networkStream write:&self.buffer[self.bufferOffset] maxLength:self.bufferLimit - self.bufferOffset];
4

2 に答える 2

2

NSNetserviceを誤解されたと思います。NSNetServiceを使用して、ネットワーク内のネットワークサービスに関するBonjour情報を公開できます。サーバーを作成するのではなく、サービスを利用できるサーバーがあることをクライアントに通知するだけです。そのようなサーバーがない場合でも、サーバーがあることをクライアントに通知します。

bonjourブラウザを試して、NSNetServiceの機能を確認してください。表示されるすべてのエントリは、公開されたNSNetServicesです。
または、タイプ_afpovertcp._tcpでサービスを公開することもできます。ファインダーのサイドバーを見て、NSNetServicesがどのように使用されているかを確認してください。


dns-sd -R Test _smb._tcp. "" 12345
nc -l 12345 > tmp.png

これらの行はSMBとはまったく関係ありません。サービスをSMBとして宣伝しているからといって、サーバーが実際にSMBを理解しているとは限りません。
そして、nc(別名netcat)は、その名前が示すとおりに機能します。送信したものはすべてファイルにダンプします。SMBではなく、まったくありません。

また、認証にTXTRecordsを使用することは悪い考えです。ネットワークに接続しているすべての人が、TXTRecordsを取得します。

簡単に言うと、NSNetServicesはSMB接続の作成を支援しません。SMBサーバーの使用が完了したら、NSNetServicesを使用して、ネットワーク内のクライアントにSMBサーバーがあることを通知できます。ただし、このサーバーの作成には役立ちません。

于 2011-03-05T07:55:30.763 に答える
1

試しましたか:self.netService = [[[NSNetService alloc] initWithDomain:@ "10.212.19.121" type:@ "_ smb._tcp.local" name:@ "lanmanserver"] autorelease];

于 2011-03-05T06:52:53.703 に答える