簡體   English   中英

使用 NSNetService 類與 Windows 機器上共享的文件夾建立 SMB tcp ip 連接

[英]Using NSNetService class to make an SMB tcp ip connection to a folder shared on windows machine

我一直在想辦法使用 iPhone 訪問我的 Windows 共享文件夾。 所需的功能是我正在構建的更大企業應用程序的一部分。 這是已經問過類似問題但沒有運氣的人 - iOS 是否支持通過 SMB 進行文件操作?

現在,我找到了名為“ SimpleNetworkStreams ”的蘋果開發者教程,它通過將 NSNetService 實例的類型設置為協議x-SNSUpload._tcp來使用 NSNetService 通過 tcp 使用 x-SNSUpload 協議

這是他們如何做到的 -

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

因此,如果我只是將_x-SNSUpload._tcp替換為_smb._tcp並在我的 macbook 上運行 SMB 服務器。 我運行以下一組命令在我的 macbook 上啟動 SMB

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

nc -l 12345 > tmp.png

然后我就可以將 iPhone 中的圖片傳輸到我的 macbook 的根目錄。 我希望對 Windows 機器上的共享文件夾做同樣的事情。

共享文件夾的名稱是“測試共享”。 我已經明確地在我的 Windows 機器中共享了我的“測試共享”文件夾,並且所有人都可以完全控制。 代碼的完整細節如下(更新后)

如果我直接在瀏覽器上輸入“smb:\\\\10.212.19.121”,我就可以訪問我的共享文件夾。 它會打開 finder 應用程序,並為我提供一個選項來安裝“臨時共享”文件夾。


更新 -從上面取出的大量冗余文本以及關於 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 對象來瀏覽服務。”

為承載 SMB 服務器的服務器實例化 NSNetService 的對象

// 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];

我想你誤解了 NSNetservice。 NSNetService 可用於發布有關網絡中網絡服務的Bonjour信息。 它不會為您創建服務器,它只是告訴客戶端有一個提供服務的服務器。 即使沒有這樣的服務器,它也會告訴客戶端有一個。

試試bonjour 瀏覽器看看 NSNetService 做了什么。 您將看到的所有條目都是已發布的 NSNetServices。
或者您可以發布類型為 _afpovertcp._tcp 的服務。 並查看 finder 中的側邊欄以了解如何使用 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 服務器。 但它不會幫助您創建此服務器。

你有沒有試過: self.netService = [[[NSNetService alloc] initWithDomain:@"10.212.19.121" type:@"_smb._tcp.local" name:@"lanmanserver"] autorelease];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM