Andy Lanng Ответов: 1

New tcpclient().connected выдает нулевую ссылку


Эй,

Я написал на заказ "проверку задержки". Есть клиент и сервер. Клиент-это консольное приложение, а служба-это служба. Я ограничен .Net 3.5.

Так что все это работает локально нормально, но на главном сервере клиентов выдает ошибку:
while (!client.Connected && retry-- > 0)
Нулевое исключение, справ
at TcpClient.Get_Connected (указывает на строку выше)

Я ничего не понимаю. Я только что создал его экземпляр. Самое большее, что она может быть закрыта.

вот код для этого метода.
private int GetPort(long taskLength, bool isReport = false)
{
    IPEndPoint endPoint = new IPEndPoint(_address, _port);
    TcpClient client = new TcpClient();
    int port = 0;


    int retry = retries;

    while (!client.Connected && retry-- > 0)
    {
        try
        {
            client.Connect(endPoint);

            using (var stream = client.GetStream())
            using (StreamReader reader = new StreamReader(stream))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.AutoFlush = true;
                if (isReport)
                {
                    writer.WriteLine($"report:{taskLength}");
                }
                else
                {
                    writer.WriteLine($"port request:{taskLength}");
                }
                string portString = reader.ReadLine();
                if (!string.IsNullOrEmpty(portString) && int.TryParse(portString, out port))
                    return port;
                throw new BadResponseException("Port format incorrect");
            }
        }
        catch (BadResponseException)
        {
            //retry
        }
        catch (SocketException)
        {
            //retry
        }
        finally
        {
            client.Close();
        }
    }
    return port;
}
Для первого звонка: taskLength = 1 и isReport = false.


Любые идеи о том, что могло бы вызвать это, помогли бы ^_^

Спасибо

Что я уже пробовал:

Я протестировал клиент и сервер локально, и сервер работает как локально для него. Это первый тест, прежде чем я помещу клиента на другую машину.

Сервер имеет 1 порт, открытый для запросов от клиентов. Он открывает асинхронный порт, настраивает его на получение определенного количества байтов и отвечает, что это номер порта.

У меня есть только 1 клиент, работающий с банкоматом, который является однопоточным.

1 Ответов

Рейтинг:
10

Jochen Arndt

Я предполагаю, что это происходит только тогда, когда есть несколько повторных попыток. Тогда ваш TcpClient возможно, он больше не действителен из-за Close() вызов:

Метод Close помечает экземпляр как удаленный и запрашивает, чтобы связанный сокет закрыл TCP-соединение.
Обратите внимание на "утилизированный".

Нет никакой необходимости выполнять Connected проверяйте вообще потому что так будет всегда false в вашем коде после закрытия. Но если ... Close() вызов делает объект недействительным, затем вы можете получить ту же ошибку при следующем вызове. Connect() вызов. Единственным решением было бы тогда использование нового экземпляра (необязательно ограниченного случаем, когда Connect() вызов не вызывает исключения; когда это вызывает исключение, нет необходимости закрывать).


Andy Lanng

Это всегда что-то простое, чего я просто не вижу".;
Та, что сработало ^_^