Nano Hash - криптовалюты, майнинг, программирование

Как использовать IP-адрес клиента в функции, включенной в серверную программу?

Я написал программу сокета C. В моей серверной программе я включил функцию *data_process()*.

мой вопрос

Программа-сервер получает IP-адрес клиента и записывает его в файл *info_agent_report.txt*.

Мне нужно использовать этот IP-адрес в программе *data_process()* (которая включена в серверную программу*), которая создает файл *task_agent_report.csv*.

Могу ли я использовать его? (я использовал, но не отображает IP-адрес в файле *task_agent_report.csv*!!)

Может ли кто-нибудь помочь мне.

Моя программа server и data_process() выглядит следующим образом

int main()
{
  //intialization
  //....
  struct sockaddr_in client_address;
  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) > 0)
    address.sin_family = AF_INET;
  address.sin_addr.s_addr = inet_addr("127.0.0.1");
  address.sin_port = htons(9734);
  server_len = sizeof(address);
  bind(sockfd, (struct sockaddr *) &address, server_len);

  listen(sockfd, 5);
  while (1)
  {
    char ch;

    client_len = sizeof(client_address);

    new_sockfd = accept(sockfd, (struct sockaddr *) &client_address,
        &client_len);

    if (new_sockfd == -1)
    {
      perror("Connection Not Accepted!!");
      return (1);
    }
    else
    {
      printf("..");
      //to dispaly ip address
      FILE* ta_address = fopen("info_agent_report.txt", "a+");
      fprintf(ta_address, "%s,", inet_ntoa(client_address.sin_addr));
      fclose(ta_address);

      log = open("info_agent_report.txt", O_CREAT | O_RDWR | O_APPEND, 0777);
      if (log == -1)
      {
        perror("cannot open info_agent_report file\n");
        return (1);
      }

      do
      {
        x1 = read(new_sockfd, buffer1, 1024);
        x2 = write(log, buffer1, x1);
      } while (x1 > 0);
      close(log);
      close(new_sockfd);
    }

    data_process();
  }
}
//i need to use the ip address in this function

программа data_process:

void ProcessPacket(unsigned char* , int);
void print_ip_header(unsigned char*, int);
void print_tcp_packet(unsigned char *, int);
void print_udp_packet(unsigned char *, int);
void print_icmp_packet(unsigned char*, int);
void PrintData(unsigned char*, int);

FILE *logfile;

int data_process()
{
  //intialising...   
  unsigned char *buffer3 = (unsigned char *) malloc(1024);

  //i tried to print the ip address on the terminal but it din't

  struct sockaddr_in client_address;
  printf("print on the terminal from info agent%s\n",
      inet_ntoa(client_address.sin_addr));

  infile = open("info_agent_report.txt", O_RDONLY);
  if (infile == -1)
  {
    perror("cannot open info_agent_report file\n");
    return (1);
  }

  logfile = fopen("task_agent_processed.csv", "w+");
  if (logfile == NULL)
  {
    printf("Unable to create task_agent_processed file.");
  }

  do
  {
    data_size = read(infile, buffer3, 1024);
    print_tcp_packet(buffer3, data_size);

  } while (data_size > 0);

  fclose(logfile);
  close(infile);
  return 0;
}

void print_tcp_packet(unsigned char* Buffer, int Size)
{
  //initialization,structure.... 

  //i need to use the ip address in the csv file to display it in the same row   

  fprintf(logfile, "%s,%d,%u\n", inet_ntoa(client_address.sin_addr), 1,
      ntohs(tcph->source));
}
12.12.2013

  • Скомпилируйте с символами и запустите программу с помощью отладчика, шаг за шагом проверяя, что происходит с задействованными переменными. 12.12.2013

Ответы:


1

Ваша программа имеет неправильную структуру. вы получаете адрес клиента в переменной client_address в программе main().

Затем вы вызываете функцию data_process(), там вы снова объявляете переменную client_address и пытаетесь получить IP-адрес из этой локальной переменной, но эта локальная переменная не будет содержать никакой достоверной информации о клиенте.

Если вы хотите получить IP-адрес в функции data_processing(), вам нужно сделать объявление struct sockaddr_in client_addressvariable глобальным или же передать эту переменную в data_processing().

Я думаю, вы пытаетесь отобразить детали пакета, такие как анализатор пакетов. можно попробовать с RAW SOCKET, это облегчит вашу работу. man 7 необработанный

12.12.2013
  • просто объявление struct sockaddr_in client_address глобально решает мою проблему? я имею в виду, могу ли я получить доступ к IP-адресу в моей программе обработки данных ()? 13.12.2013
  • да, вы можете получить, удалить объявление из main() и dataprocess() и поместить его глобально. Я скомпилировал вашу программу, я понял. 13.12.2013
  • да, это программа для анализа пакетов. Вы знаете, как рассчитать время для каждого захваченного пакета? 13.12.2013
  • @ user3040523 вы хотите время захвата пакета? 13.12.2013
  • Да, мне нужно захваченное время для каждого пакета. Я использовал метку времени, но она не работает. 14.12.2013
  • @user3040523 использовать функцию time() при получении пакета 14.12.2013
  • я использовал функцию gettimeofday(), но одно и то же время отображается для каждого полученного пакета. 14.12.2013
  • @ user3040523, можешь дать ссылку на свой полный код? тогда я могу попытаться найти, в чем проблема. 15.12.2013
  • Я. Здесь [stackoverflow.com/questions/20603794/ Я не знаю, как распечатать захваченное время для каждого пакета :( 16.12.2013

  • 2

    Не уверен, что понял вашу проблему, но почему бы вам не использовать значение в памяти вместо записи/чтения из файла?

    char* ip_addr;
    // ...
    ip_addr = inet_ntoa(client_address.sin_addr);
    // ...
    data_process(ip_addr);
    

    На справочной странице char*, возвращаемый inet_ntoa, размещается статически. Это означает, что есть статический указатель, содержащий значение для вас. Это также означает, что значение по этому же адресу будет меняться каждый раз, когда вы вызываете inet_ntoa. Если вам каким-то образом нужно вызвать inet_ntoa, пока вам все еще нужен указатель, скопируйте значение в другой буфер (обычно с strcpy и char[16])

    12.12.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..