2011-02-12 3 views
2

iPhone을 사용하여 Windows 공유 폴더에 액세스하는 방법을 알아 내려고 노력했습니다. 원하는 기능은 내가 만들고있는 더 큰 엔터프라이즈 앱의 일부입니다. 프로토콜 NSNetService 인스턴스의 유형을 설정하여 TCP를 통해 X-SNSUpload 프로토콜을 사용하도록 NSNetService을 사용한다 "SimpleNetworkStreams"라고 Does iOS support file operations via SMB?NSNetService 클래스를 사용하여 Windows 컴퓨터에서 공유되는 폴더에 SMB TCP IP 연결을 만듭니다.

이제, 내가 찾은 애플 개발자 튜토리얼 - 여기에 이미 비슷한 질문하지만 행운을 요청했다 사람입니다 X-SNSUpload._tcp

다음

그들이 그것을 짓을하는 방법입니다 - 그래서

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

난 그냥 _smb._tcp으로 _x-SNSUpload._tcp를 교체하고 내 맥북에 SMB 서버를 실행합니다. 나는

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

nc -l 12345 > tmp.png 

가 그럼 난 내 맥북의 루트 디렉토리에 내 아이폰에 사진을 전송할 수 있어요 내 맥북에 SMB를 시작하는 명령의 설정에 따라 실행합니다. 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. Apple 설명서에서 말하는 방법대로

    "NSNetService 객체를 직접 생성하거나 (정확한 호스트 및 포트 정보를 알고있는 경우) NSNetServiceBrowser 객체를 사용하여 서비스를 검색 할 수 있습니다. "

NSNetService의 목적은 self.networkStream에 입력 NSOutputStream의 출력 스트림 오브젝트를 취득 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]]; 

를 호스팅하는 서버에 대해 인스턴스화됩니다.

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

NSNetservice를 오해 한 것 같습니다. NSNetService를 게시하여 네트워크에있는 네트워크 서비스에 대한 정보를 Bonjour 게시하는 데 사용할 수 있습니다. 그것은 당신을 위해 서버를 생성하지 않고 단지 서비스가 가능한 서버가 있다는 것을 클라이언트에게 알려줍니다. 그러한 서버가 없다고해도 클라이언트에게 클라이언트가 있다는 것을 알려줍니다.

NSNetService의 기능을 보려면 bonjour browser을 시도하십시오. 표시되는 모든 항목은 게시 된 NSNetServices입니다.
또는 _afpovertcp._tcp 유형의 서비스를 게시 할 수 있습니다. Finder에서 사이드 바를 보면서 NSNetServices가 어떻게 사용되는지 생각해보십시오.


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

이 라인은 SMB와는 절대적으로 관계가 없습니다. SMB가 서버가 실제로 SMB를 이해한다는 것을 의미하지는 않기 때문에 서비스를 광고하고 있기 때문입니다.
nc (일명 netcat)는 이름에서 알 수있는 것과 정확히 일치합니다. 그것은 보내는 모든 것을 파일에 덤프합니다. SMB가 아니라 전혀 아닙니다.

TXTRecords를 인증 용으로 사용하는 것은 좋지 않습니다. 네트워크에 연결된 모든 사람이 TXTR 코드를 받게됩니다.

길게 이야기하면 NSNetServices은 SMB 연결을 만드는 데 도움이되지 않습니다. SMB 서버를 완료하면 NSNetServices를 사용하여 네트워크의 클라이언트에게 SMB 서버가 있음을 알릴 수 있습니다. 하지만이 서버를 만드는 데 도움이되지는 않습니다.

+0

@fluchtpunkt NSNetService를 사용하여 SMB 서버를 만들지는 않습니다. MacBook의 내 브라우저에서 smb : \\ 10.212.19.121을 사용하여 Windows 공유 폴더 (10.212.19.121은 Windows의 IP 주소 임)에 연결할 수 있습니다. 연결하면 인증됩니다. 따라서 SMB 서비스가 이미 실행 중입니다. 나는 10.212.19.121 m/c &를 연결하기 위해 클라이언트로서 iPhone 내에서 NSNetService 객체를 사용하고자한다. & self & lt; NSNetService alloc & gt; _tcp. " 로컬 클라이언트 NSNetService 개체의 TXTRecords를 설정 중입니다. –

+0

NSNetService는 클라이언트도 서버도 아닙니다. SMB와는 아무런 관련이 없습니다. SMB-Servers를 찾으려면 NSNetServiceBrowser를 사용할 수 있지만 직접 smb 클라이언트를 구현해야합니다. NSNetService가 로컬 (즉, 게시되지 않은 것)보다 존재하는 이유가 없습니다. 당신은 완전히 NSNetService의 사용에 대해 오해하고 있습니다. "Hello,이 프로토콜을 이해할 수 있습니다.이 IP 및이 포트에서 연결하십시오"- 브로드 캐스트에만 사용할 수 있습니다. 실제 서버 또는 클라이언트와 관련된 것은 없습니다. 당신은 그것들을 독자적으로 구현해야합니다. –

+0

@fluchtpunkt 내가하고 싶은 생각에 대해 혼란이있을 수 있습니다. 나는 그 질문을 더 자명하게하려고 노력했다. 응답 확인 –

1

는 시도 유무 : self.netService = [[[NSNetService의 ALLOC] initWithDomain : @ "_ smb._tcp.local"이름 : "10.212.19.121"유형 @ @ "에 lanmanserver"] 오토 릴리즈] ;

+0

나는 @fluchtpunkt 답변 및 의견에 대해 확신합니다. 이 NSNetService는 SMB 패키징을 수행하지 않습니다. 그러나, 나는 당신의 제안을 시험해 보았다. 일하지 않았어. 답장을 보내 주셔서 감사합니다. –

관련 문제