1
1

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