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 - -
코드는에서 가져 우리가 보내고 자하는 파일을
- 개방형 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];
- 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];
@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를 설정 중입니다. –
NSNetService는 클라이언트도 서버도 아닙니다. SMB와는 아무런 관련이 없습니다. SMB-Servers를 찾으려면 NSNetServiceBrowser를 사용할 수 있지만 직접 smb 클라이언트를 구현해야합니다. NSNetService가 로컬 (즉, 게시되지 않은 것)보다 존재하는 이유가 없습니다. 당신은 완전히 NSNetService의 사용에 대해 오해하고 있습니다. "Hello,이 프로토콜을 이해할 수 있습니다.이 IP 및이 포트에서 연결하십시오"- 브로드 캐스트에만 사용할 수 있습니다. 실제 서버 또는 클라이언트와 관련된 것은 없습니다. 당신은 그것들을 독자적으로 구현해야합니다. –
@fluchtpunkt 내가하고 싶은 생각에 대해 혼란이있을 수 있습니다. 나는 그 질문을 더 자명하게하려고 노력했다. 응답 확인 –