Jagadisha_Ingenious Ответов: 1

Экземпляр Tcp/IP держит порт занятым


Всем Привет,

У меня есть приложение, через которое я пытаюсь связаться с оборудованием через ethernet. Мое приложение имеет 2 кнопки, одна для подключения и другая для отправки команд.

Событие щелчка кнопки подключения происходит так, как показано ниже:
private void btnConnect_Click(object sender, EventArgs e)
      {
              client = new TcpClient();
              client.SendTimeout = SEND_TIMEOUT;
              client.ReceiveTimeout = RESPONSE_TIMEOUT;
              client.Connect(DeviceIPAddress, DevicePortNumber);
              if (!client.Connected)
               {
                 throw new Exception("Device not connected");
               }
      }

 private void btnSendCmd_Click(object sender, EventArgs e)
      {
        using (client = new TcpClient(DeviceIPAddress, DevicePortNumber))
          {
          client.SendTimeout = SEND_TIMEOUT;
          client.ReceiveTimeout = RESPONSE_TIMEOUT;
          string commandResponse = null;
          byte[] sendDataBuffer;
          byte[] receiveDataBuffer = new byte[1024];

          // other process takes places here
          }
        }

Проблема в том, что всякий раз, когда я нажимаю на кнопку подключения, создается экземпляр TCP, и порт постоянно занят. И после подключения, если я попытаюсь нажать на кнопку SendCommand, он выдаст ошибку, сказав, что не может общаться.

Любая помощь действительно ценится.

Заранее спасибо,
Джагадиша. Н

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

Я попытался прокомментировать приведенные ниже строки кода в событии щелчка кнопки connect, но проблема осталась прежней.
 //client.SendTimeout = SEND_TIMEOUT;
//client.ReceiveTimeout = RESPONSE_TIMEOUT;

1 Ответов

Рейтинг:
2

F-ES Sitecore

Ваша кнопка подключения создает клиент и подключается к устройству. Затем ваша кнопка отправки создает новый клиент, не подключается с помощью этого клиента, а затем пытается отправить данные.

Вам нужно повторно использовать клиент из вашего кода подключения в вашем коде отправки, поэтому удалите строку "using (client=", и когда код ссылается на "клиент", он будет ссылаться на клиента, созданного вами в коде подключения.


Jagadisha_Ingenious

Спасибо за ваше предложение, Эс, это сработало для меня. Не могли бы вы рассказать мне, как избавиться от объекта клиента в событии нажатия кнопки SendCmd? Я попробовал использовать клиента.Метод Dispose (), объект не становится пустым.

F-ES Sitecore

Вы можете позвонить клиенту.Close() однако клиент.Dispose() также должен работать, возможно, вы даже захотите вызвать оба метода. Это не сделает переменную "клиент" нулевой, хотя, если вы хотите, чтобы клиент был нулевым, вам нужно будет обнулить его самостоятельно

клиент.Располагать();
клиент = null;