Async TcpClient Connect отличается при развертывании в Windows и Linux - PullRequest
0 голосов
/ 27 июня 2018

Я пишу клиентское приложение, которое должно подключаться к серверному приложению через сокет TCP. Платформа выбора .NET Core 2.0 (это не ASP.NET Core, это просто консольное приложение). Я использую класс TcpClient и его методы .BeginConnect() и .EndConnect(), чтобы установить время ожидания соединения. Вот код:

public class Program
{
    public static void Main(String[] args)
    {
        var c = new TcpClient();
        int retryCount = 0;
        var success = false;
        IAsyncResult res;
        do
        {
            if (retryCount > 0) Console.WriteLine("Retry: {0}", retryCount);
            retryCount++;
            c.Close();
            c = new TcpClient();
            res = c.BeginConnect("10.64.4.49", 13000, null, null);
            success = res.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2));
            Console.WriteLine(success.ToString());
        }
        while (!c.Connected);

        c.EndConnect(res);
        Console.WriteLine("Connected");
        Console.ReadLine();

    }

Когда я компилирую, публикую и запускаю это консольное приложение, и ничего не прослушивает IP-адрес и порт, результаты, если приложение работает в Windows или Linux, отличаются. Вот результаты по Windows: On Windows 10 machine

Вот как это выглядит в Linux: enter image description here

Результаты практически одинаковы, единственное отличие состоит в том, что в Windows он пытается подключиться каждые две секунды, но в Linux он действует так, как будто эти две секунды игнорируются и переходит в «сеанс неконтролируемого подключения», как я его называю. Я не уверен, что это проблема .NET Core или какая-то настройка Linux, которую Windows уже предопределил. Может кто-нибудь посоветовать, в чем может быть проблема, и в конечном итоге предложить решение.

Заранее спасибо,

Юлиан Димитров

1 Ответ

0 голосов
/ 27 июня 2018

Мне кажется, я понимаю, почему у вас возникла проблема, и похоже, что она основана на неправильном понимании того, что должен делать тайм-аут.

Ради тестирования я изменил ваш код так:

var sw = Stopwatch.StartNew();
res = c.BeginConnect("127.0.0.1", 12, null, null);
success = res.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(10));
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);

В Windows я вижу, что соединение разрывается через ~ 1 секунду, в то время как при запуске того же кода в Linux оно почти мгновенно прерывается. Кажется, что Linux способен работать, если соединение возможно быстрее, чем Windows. Я думаю, что, возможно, вы ошибаетесь во времени, которое Windows тратит на разработку, но не может связываться с указанным вами временем ожидания.

Далее: Что такое тайм-аут? Тайм-аут - это максимум времени, которое может потребоваться для установления соединения. Это предел . Это означает, что операция должна завершиться менее чем за X секунд (например, 10 секунд), или она не выполнена. Если операция завершится через 1 секунду, она будет немедленно возвращена.

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