TcpClient.ConnectAsyn c и TcpClient.BeginConnect всегда возвращают true в приложении Xamarin.Forms Android - PullRequest
0 голосов
/ 01 апреля 2020

Я подал заявку в своем проекте Xamarin.Forms, где я могу подключить свой телефон Android к своему компьютеру с помощью TCP-соединения. Я обнаружил, что при использовании как TcpClient.ConnectAsyn c, так и TcpClient.BeginConnect они оба возвращают этот client.Connected - true, хотя порт не открыт. Я проверил это, потому что я пробовал случайные IP-адреса и случайные порты, и он по-прежнему говорит, что соединение успешно в Button_Clicked 2 раза, но при использовании TcpClient.BeginConnect client.Connected всегда возвращает true. Я точно знаю, что клиент не подключен, потому что у меня есть система обнаружения, которая выводит пользователя на страницу переподключения при потере соединения.

Код, который я имею для моего TCPClient в MainPage.xaml. cs:

TcpClient client = new TcpClient();
private async void Button_Clicked(object sender, EventArgs e)
{
    await client.ConnectAsync(ipAddress.Text, Convert.ToInt32(Port.Text));

    if (client.Connected)
    {
        await DisplayAlert("Connected", "The client has successfully connected", "OK");
    }
    else
    {
        await DisplayAlert("Connection Unsuccessful", "The client couldn't connect!", "OK");
    }
}

Я также пытался использовать TcpClient.BeginConnect из Как установить время ожидания для TcpClient? :

TcpClient client = new TcpClient();
private async void Button_Clicked(object sender, EventArgs e)
{
    var result = client.BeginConnect(ipAddress.Text, Convert.ToInt32(Port.Text), null, null);
    var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1));

    if (success)
    {
        await DisplayAlert("Connected", "The client has successfully connected", "OK");
    }
    else
    {
        await DisplayAlert("Connection Unsuccessful", "The client couldn't connect!", "OK");
    }
}

Я попытался найти проблема, и единственное, что я обнаружил, было: TcpClient.Connected возвращает true, но клиент не подключен, что я могу использовать вместо этого? , но эта ссылка указывает, что client.Connected bool остается true после отключения, в то время как моя проблема в том, что он говорит, что клиент подключается, даже если клиент никогда не получает истинное соединение с сервером.

В настоящее время используется проект. NET Стандарт 2.0

1 Ответ

0 голосов
/ 02 апреля 2020

Я выяснил причину, по которой он вернул бы client.Connected: true, потому что выполнение одного и того же метода ConnectAsync / BeginConnect дважды, пока клиент все еще пытается подключиться и еще не истек тайм-аут, приведет к значению client.Connected для быть верным по какой-то причине.

Единственный способ исправить это - дождаться завершения таймаута или, если тайм-аут слишком велик, избавиться от клиента и создать нового.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...