Почему функция C recv () в моей библиотеке для самозаписи даже сломала мою программу Labview, если я не продолжал отправлять данные с сервера. c через сокет TCP - PullRequest
1 голос
/ 17 июня 2020

Я хочу написать простую базу dll клиента TCP-сокета на основе C импорта языка в мою программу Labview. Я определил три функции в своей dll следующим образом:

char* DLL_EXPORT TCPSocket(int input); //open socket
void DLL_EXPORT closeSocket(void); //close socket
int DLL_EXPORT pulse(int trig); //waiting incoming signal from server.c and return a value

первые две из них работали отлично, но последняя всегда блокирует и ломает мой Labview, если он ничего не получает. Основная функция, которую я хочу, - это ожидание сигнала триггера от моего сервера, поэтому должен существовать интервал времени ожидания, и именно поэтому он привел к сбою моего Labview.

int DLL_EXPORT pulse(int trig)
{
  int Text;
  int pass = 0, rx;

  send(sock,(char *)&trig,sizeof(trig),0);
  rx = recv(sock,(char *)&Text,64,0);
  while(1)
  {
    if(rx <= 0)
    {
      pass = 0;
      break;
    }
    else if(rx > 0)
    {
      pass = Text;
      break;
    }
    return pass;
  }
  return pass;
}

Можно ли создать dll для Labview только для ожидания выходного сигнала завершения и, пожалуйста, не взламывайте sh my LabVIEW? введите описание изображения здесь

1 Ответ

0 голосов
/ 18 июня 2020

Существует несколько причин, по которым LV может обнаружить sh при вызове DLL. Например, ошибка сегментации или любая другая ошибка sh внутри DLL.

С помощью int Text; вы выделяете 4 байта памяти для хранения входящих данных, но вы позволяете функции recv() получать до 64 байт. Если он получил более 4 байтов, он записывает данные за границу памяти Text, и это может привести к ошибке сегментации. Просто разрешите чтение до 4 байтов (или sizeof(Text)).

Кстати: если вы получите один байт, например A (или 0x41), он будет помещен в самый значащий байт Text, поэтому Text будет 0x41000000 = 1090519040. Но только если Text раньше было 0. Вы не инициализируете его, что означает, что он может содержать любое случайное значение.

Далее, что такое sock? Это нигде не объявлено в вашем коде. (Да, иначе он не будет компилироваться). Если sock не инициализирован правильно, recv() может взломать sh.

Наконец, текущая функциональность может быть достигнута в LabVIEW. Есть ли причина использовать DLL?

...