使用NSNetService类与Windows机器上共享的文件夹建立SMB tcp ip连接

时间:2011-02-12 00:36:17

标签: iphone share smb nsnetservice

我一直试图找出一种使用iPhone访问我的Windows共享文件夹的方法。所需的功能是我正在构建的更大的企业应用程序的一部分。这是一个已经问过类似问题但没有运气的人 - Does iOS support file operations via SMB?

现在,我找到了名为“SimpleNetworkStreams”的苹果开发人员教程,它通过将NSNetService实例的类型设置为协议x-SNSUpload._tcp

,使用NSNetService在tcp上使用x-SNSUpload协议

他们是如何做到的 -

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

所以,如果我只是用_smb._tcp替换_x-SNSUpload._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应用程序,并为我提供了安装“temp sharing”文件夹的选项。


更新 - 从上面取出的大量冗余文本以及有关SimpleNetworkStream如何工作以及我调整的内容的更多详细信息如下所示。

代码取自 - SimpleNetworkStreams -

  1. 为我们要发送的文件打开NSInputStream类型的流
  2. //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对象来浏览服务。”

    2. 为托管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];
      

2 个答案:

答案 0 :(得分:2)

我认为你误解了NSNetservice。 NSNetService可用于发布有关网络中网络服务的Bonjour信息。它不会为您创建服务器,它只是告诉客户端存在可用服务的服务器。即使没有这样的服务器,它也会告诉客户端有一个服务器。

尝试使用bonjour browser查看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服务器。但它无法帮助您创建此服务器。

答案 1 :(得分:1)

你试过了吗? self.netService = [[[NSNetService alloc] initWithDomain:@“10.212.19.121”type:@“_ smb._tcp.local”name:@“lanmanserver”] autorelease];