Ссылаясь на DNSSDObjects в dns_sd.h и DNSServiceResolve в MonoTouch - PullRequest
1 голос
/ 08 января 2012

Я хочу добавить ссылку на DNSSDObjects к проекту в MonoTouch, в частности к объекту DNSServiceResolve.

Я хочу получить доступ к DNSServiceResolve в проекте MonoTouch, но нигде не могу найти этот класс.

Как это можно сделать?

1 Ответ

0 голосов
/ 05 января 2013

Я получил функции из dns_sd.h, работающие с P / Invokes.Большинство определений уже было сделано в проекте zeroconfignetservices [1], в частности в файле mDNSImports.cs.Вместо ссылки dnssd.dll на iOS это /usr/lib/system/libsystem_dnssd.dylib.

Так, например, определение для DNSServiceQueryRecord будет:

[DllImport("/usr/lib/system/libsystem_dnssd.dylib")]
public static extern DNSServiceErrorType DNSServiceQueryRecord(out IntPtr sdRef,
    DNSServiceFlags flags,
    UInt32 interfaceIndex,
    [MarshalAs(
            UnmanagedType.CustomMarshaler,
            MarshalTypeRef = typeof(Utf8Marshaler))] String fullname,
    DNSServiceType rrType,
    DNSServiceClass rrClass,
    DNSServiceQueryReply callBack,
    IntPtr context);

И запрос для SRVзапись будет выглядеть следующим образом:

public void DoDnsLookup()
{
    IntPtr sdRef;
    var result = DNSServiceQueryRecord(
        out sdRef,
        DNSServiceFlags.LongLivedQuery,
        0,
        "_xmpp-client._tcp.gmail.com",
        DNSServiceType.SRV,
        DNSServiceClass.IN,
        DnsServiceQueryReply,
        IntPtr.Zero
    );
    if (result == DNSServiceErrorType.NoError)
    {
        DNSServiceProcessResult(sdRef);
        DNSServiceRefDeallocate(sdRef);
    }
}

//see [2] why this method is static and the attribute
[MonoPInvokeCallback(typeof(DNSServiceQueryReply))]
public static void DnsServiceQueryReply(
    IntPtr sdRef,
    DNSServiceFlags flags,
    UInt32 interfaceIndex,
    DNSServiceErrorType errorCode,
    [MarshalAs(
        UnmanagedType.CustomMarshaler,
        MarshalTypeRef = typeof(Utf8Marshaler))] String fullname,
    DNSServiceType rrType,
    DNSServiceClass rrClass,
    UInt16 rdLength,
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 7)]byte[] rData,
    UInt32 ttl,
    IntPtr context)
{
    if (result == DNSServiceErrorType.NoError)
    {
        // process returned DNS data in rData
        // a useful library for this could be Bdev.Net.Dns [3]
    }
}

Все классы, перечисления и т. д., не определенные здесь, взяты из [1].

Ссылки:

  1. http://code.google.com/p/zeroconfignetservices
  2. http://docs.xamarin.com/ios/guides/advanced_topics/limitations#Reverse_Callbacks
  3. dnslookup.codeplex.com
...