1

目標は、サービスが dns_sd API によって正常に解決された後に読み取り/書き込みストリームを取得することです。私は Apple の DNSSDObjects サンプル プロジェクトから始め、DNSSDService.m ファイルを編集して、サービスが解決された後に読み書きストリームを取得しています。

これが私がこれまでに得たものです。動作するはずですが、動作しません:(

このスレッドのコードに従うことでここまでたどり着きましたが、これがどのように行われるべきかは完全にはわかりません。

編集: Apple のドキュメントは、これがどのように行われるべきかを確認しています...「したがって、DNSServiceResolve を使用してサービスを解決したら、サービスの DNS 名 (DNSServiceResolveReply コールバックへの hosttarget パラメータ) を接続に渡す必要があります。名前による API (CFStreamCreatePairWithSocketToHost など)"

// Called by DNS-SD when something happens with the resolve operation.
static void ResolveReplyCallback(
    DNSServiceRef           sdRef,
    DNSServiceFlags         flags,
    uint32_t                interfaceIndex,
    DNSServiceErrorType     errorCode,
    const char *            fullname,
    const char *            hosttarget,
    uint16_t                port,
    uint16_t                txtLen,
    const unsigned char *   txtRecord,
    void *                  context
) 
{
  CFStringRef host = CFStringCreateWithCString(kCFAllocatorDefault,
                                               hosttarget, 
                                               kCFStringEncodingUTF8);  
    DNSSDService *       obj;
    #pragma unused(interfaceIndex)

    assert([NSThread isMainThread]);  // b/c sdRef dispatches to the main queue

    obj = (__bridge DNSSDService *) context;
    assert([obj isKindOfClass:[DNSSDService class]]);
    assert(sdRef == obj->sdRef_);
    #pragma unused(sdRef)
    #pragma unused(flags)
    #pragma unused(fullname)
    #pragma unused(txtLen)
    #pragma unused(txtRecord)

    if (errorCode == kDNSServiceErr_NoError) {
        [obj resolveReplyWithTarget:[NSString stringWithUTF8String:hosttarget] 
                               port:ntohs(port)];
    } else {
      [obj stopWithError:[NSError errorWithDomain:NSNetServicesErrorDomain
                                             code:errorCode
                                         userInfo:nil]
                  notify:YES];
    }

//now let's get read&write streams?
  CFReadStreamRef   readStream = NULL;
  CFWriteStreamRef  writeStream = NULL;
  CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
                                     host,
                                     port,
                                     &readStream,
                                     &writeStream
                                     );
  if (readStream && writeStream) {
    CFReadStreamSetProperty(readStream,
                            kCFStreamPropertyShouldCloseNativeSocket, 
                            kCFBooleanTrue);
    CFWriteStreamSetProperty(writeStream,
                            kCFStreamPropertyShouldCloseNativeSocket, 
                            kCFBooleanTrue);

    obj.inputStream =  (__bridge_transfer  NSInputStream *) readStream;
    obj.outputStream = (__bridge_transfer NSOutputStream *) writeStream;

  }
  CFRelease(host);
}
4

0 に答える 0