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

现在,我发现了一个名为“ SimpleNetworkStreams”的苹果开发人员教程,该教程使用NSNetService通过将NSNetService实例的类型设置为协议x-SNSUpload._tcp来通过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应用程序,并为我提供了安装“临时共享”文件夹的选项。



更新-从上方提取了许多多余的文本,并在下面放置了有关SimpleNetworkStreams的工作方式和我已调整的内容的更多详细信息。

该代码取自-SimpleNetworkStreams-


打开要发送的文件的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];



正如苹果文档所说


  “您可以直接创建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 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服务器。但这不会帮助您创建此服务器。

关于iphone - 使用NSNetService类与Windows计算机上共享的文件夹建立SMB TCP IP连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4975469/

10-12 12:35