1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ARSoft.Tools.Net: Xamarin.Mac/iOSで動かしてみる

Posted at

Socket is already connected

		public void AssertGoogle(DnsMessage msg)
		{
			Assert.IsNotNull (msg);
			Assert.IsTrue (msg.AnswerRecords.Count > 0);
			Assert.AreEqual( 
				173,
				(msg.AnswerRecords[0] as ARecord).Address.GetAddressBytes()[0]
			);
		}

		[Test]
		public void TestResolve ()
		{
			AssertGoogle (
				DnsClient.Default.Resolve (
					"google.com", RecordType.A)
			);
		}

結果が返らない。ブレークポイント入れるとSocket is already connectedで例外起きている。

ので、DnsClientBase.csを修正:


private byte[] QueryByUdp(DnsClientEndpointInfo endpointInfo, byte[] messageData, int messageLength, out IPAddress responderAddress)
{
  ....
                    if( udpClient.Connected )
                        udpClient.Send(messageData);
                    else 
                        udpClient.SendTo(messageData, messageLength, SocketFlags.None, serverEndpoint);


BeginResolve でも同じ


		[Test]
		public void TestResolveAsync()
		{
			DnsClient.Default.BeginResolve (
				"google.com", 
				ar => {
					AssertGoogle (
						DnsClient.Default.EndSendMessage (ar)
					);
				}, null);
		}

で結果がかえらないので、同様に修正:


        private void UdpBeginSend<TMessage>(DnsClientAsyncState<TMessage> state)
            where TMessage : DnsMessageBase, new()
        {
                 ....
                IAsyncResult asyncResult;
                if( state.UdpClient.Connected == true){
                    asyncResult = state.UdpClient.BeginSend(
                        state.QueryData, 0, state.QueryLength, 
                        SocketFlags.None,  UdpSendCompleted<TMessage>, state);
                }else {
                    asyncResult = state.UdpClient.BeginSendTo(
                        state.QueryData, 0, state.QueryLength, 
                        SocketFlags.None, state.UdpEndpoint, UdpSendCompleted<TMessage>, state);
                }

NSサーバー指定してAレコードのクエリ


		public List<System.Net.IPAddress>	ResolveAddress(
			DnsClient dns, string name, int timeout=50000 )
		{
			var msg = dns.Resolve (name);

			var addrs = msg.AnswerRecords
				.Where (a => a.RecordType == RecordType.A)
				.Select (a => ((ARecord)a).Address).ToList ();

			foreach(CNameRecord rec 
				in msg.AnswerRecords.Where( a => a.RecordType == RecordType.CName))
			{
				addrs = addrs.Concat(ResolveAddress(dns, rec.CanonicalName )).ToList();
			}

			return addrs.Distinct ().ToList ();
		}

		[Test]
		public void TestResolveByGoogle()
		{
			var google = new System.Net.IPAddress (new byte[4]{ 8, 8, 8, 8 });

			var addrs = ResolveAddress (
				            new DnsClient (google, 3000), 
				            "www.microsoft.com");

        }
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?