Ошибка HostNotFound сокета Silverlight для Windows Phone

Я получаю сообщение об ошибке HostNotFound при попытке подключения к сокету в асинхронном режиме. Я уверен, что хост работает. Самое странное, что все эмуляторы начиная с "8.1 u1 *" такой ошибки не выдают. Подключаются без проблем. Только мое устройство (htc windows phone 8s) и эмуляторы без 8.1 получают эту ошибку. Адрес хоста 109.235.68.205 и порт 6005. Я ориентируюсь на Windows Phone 8.0. У меня нет идей, как это решить.

public string Connect(string hostName, int portNumber)
    {

        string result = string.Empty;

        // Create DnsEndPoint. The hostName and port are passed in to this method.
        DnsEndPoint hostEntry = new DnsEndPoint(hostName, portNumber);

        // Create a stream-based, TCP socket using the InterNetwork Address Family. 
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // Create a SocketAsyncEventArgs object to be used in the connection request
        SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
        socketEventArg.RemoteEndPoint = hostEntry;


        // Inline event handler for the Completed event.
        // Note: This event handler was implemented inline in order to make this method self-contained.
        socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
        {
            // Retrieve the result of this request
            result = e.SocketError.ToString();

            // Signal that the request is complete, unblocking the UI thread
            _clientDone.Set();
            if(OnConnect != null)
                OnConnect(true, new ConnectionEventArgs() { Response = result });
        });



        // Sets the state of the event to nonsignaled, causing threads to block
        _clientDone.Reset();

        // Make an asynchronous Connect request over the socket
        _socket.ConnectAsync(socketEventArg);

        // Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
        // If no response comes back within this time then proceed
        _clientDone.WaitOne(TIMEOUT_MILLISECONDS);

        return result;
    }

person valentasm    schedule 04.02.2015    source источник


Ответы (1)


Мне удалось успешно запустить ваш код на эмуляторах Windows Phone 8, предназначенных для одной из моих сетевых машин.

Вызов socket.ConnectAsync уже является асинхронным запросом, который не блокирует ваш пользовательский интерфейс, поэтому я не думаю, что вам требуются ручные шаги для управления синхронизацией потоков.

Но если вы настаиваете на этой реализации, вы можете заменить DnsEndPoint на IPEndpoint в своем коде.

IPEndPoint hostEntry = new IPEndPoint(IPAddress.Parse(hostName), portNumber);

Надеюсь это поможет.

person Abdulwahab Suleiman - MSFT    schedule 04.02.2015
comment
Вместо System.Net.Socket я начал использовать Windows.Networking.Socket, который работает лучше. Основная проблема, я думаю, с Windows Phone, а не с сокетом. Он может разорвать соединение, когда захочет освободить ресурс. Ваш ответ тоже полезен :) - person valentasm; 05.02.2015