2014-02-13 1 views
1

iOS에서 Xamarin + MonoTouch를 사용하여 네트워크에서 파일을 다운로드 할 수있는 웹 서버를 검색합니다.MonoTouch에서 Bonjour NSNetService를 사용하여 NSData의 IP 주소를 입력 하시겠습니까?

해결 이벤트 핸들러로 전달되는 NSNetService에는 NSData와 같은 주소가 들어 있습니다. NSData를 실제로 IP 주소로 바꿀 수있는 좋은 방법을 찾지 못했습니다. 예를 들어 http : // < IP 주소> /folder/file.htm

이것은 NSNetService.AddressResolved입니다. 이벤트 처리기 :

private void OnServiceResolved(object sender, EventArgs args) 
{ 
     NSNetService service = (NSNetService)sender; 
     // service.Port is valid. 
     // service.HostName is valid. 
     // but we want the IP addres, which is in service.Addresses. 
     // None of the following four methods works quite right. 
     IPAddress address = (IPAddress)service.Addresses [0]; // Cannot convert type NSData to IPAddress 
     SocketAddress address2 = (SocketAddress)service.Addresses[0]; // Cannot convert NSData to SocketAddress. A binary copy might work? 
     IPHostEntry entry = (IPHostEntry)service.Addresses [0]; // Cannot convert NSData to IPHostEntry 
     IPHostEntry entry2 = Dns.GetHostByName (service.HostName); // This kinda works, but is dumb. Didn't we just resolve? 
} 

해결 이벤트의 NSNetService에서 서비스의 IP 주소를 가져 오는 올바른 방법은 무엇입니까?

답변

3

NSNetService.Addresses 속성은 NSData 인스턴스를 제공하며 IPAddress (또는 기타 .NET 유형)이 소화 할 수있는 인스턴스로 변환되어야합니다. 예 :

MemoryStream ms = new MemoryStream(); 
(ns.Addresses [0] as NSData).AsStream().CopyTo (ms); 
IPAddress ip = new IPAddress (ms.ToArray()); 

이 당신에게 IPv6 주소를 반환 할 수 있습니다 (또는 IPAddress가 채택하지 않도록 형식). Addresses 번을 모두 반복하여 을 가장 좋은 개로 찾을 수 있습니다.

향후 버전의 Xamarin.iOS에 편리한 메소드를 추가 할 것입니다.

static IPAddress CreateFrom (NSData data) 
{ 
    byte[] address = null; 
    using (MemoryStream ms = new MemoryStream()) { 
     data.AsStream().CopyTo (ms); 
     address = ms.ToArray(); 
    } 
    SocketAddress sa = new SocketAddress (AddressFamily.InterNetwork, address.Length); 
    // do not overwrite the AddressFamily we provided 
    for (int i = 2; i < address.Length; i++) 
     sa [i] = address [i]; 
    IPEndPoint ep = new IPEndPoint (IPAddress.Any, 0); 
    return (ep.Create (sa) as IPEndPoint).Address; 
} 
+1

감사합니다 :

UPDATE

더 완벽한 버전, 즉 같을 것이다, IPAddress 반환합니다. Xamarin에서 쉽게 변환 할 수 있다면 좋을 것입니다. :) –

관련 문제