The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
thread + snmp(asynchapp), !*! fura13, 26-Июл-04, 16:08  [смотреть все]
       Здраствуйте.
Возникли проблемы с асинхронным отправкой/приемом snmp ( ver. 1 ) пакетов. Опишу по порядку свои действия : 1. получаю вектор snmp-заданий ( комьюнити, айпи, оид ) не менее 500 . Делаю snmp_parse_oid - т.к. он не thread-safe . Далее стартуют треды ... тело тред-функции :
====================================
  SOCK_STARTUP;
pthread_mutex_lock(&job_mutex);
  if (!(th_arg.sess = snmp_open(&(th_arg.ss)))){
    th_answ[th_arg.i].flag = 2;
    th_answ[th_arg.i].an = false;
    SOCK_CLEANUP;
    snmp_perror("snmp_open");
  }
  else{
    th_arg.req = snmp_pdu_create(SNMP_MSG_GET);
    snmp_add_null_var(th_arg.req, th_arg.oid_name, th_arg.oid_len);
    if (!snmp_send(th_arg.sess, th_arg.req))
       snmp_free_pdu(th_arg.req);
  }
  while ( th_answ[th_arg.i].an){
    int fds = 0, block = 1;
    fd_set fdset;
    timeval *timeout;
    timeout = new timeval;
    FD_ZERO(&fdset);
    snmp_select_info(&fds, &fdset, timeout, &block);
    fds = select(fds, &fdset, NULL, NULL, block ? NULL : timeout);
    delete timeout;
    if(fds){
      snmp_read(&fdset);
    }
    else{
      snmp_timeout();
    }
  }
pthread_mutex_unlock(&job_mutex);

  snmp_close(th_arg.sess);
  SOCK_CLEANUP;
=========================================
    И ф-ция ассинхронного приема :
=========================================
int asynch_response(int operation, snmp_session *ss, int reqid, snmp_pdu *pdu, void* mg)
{
  int cx = *(int *) mg;
  if (operation == 1)
  {
    char             buf[128];
    netsnmp_variable_list *vp;
    vp = pdu->variables;
    if (pdu->errstat == SNMP_ERR_NOERROR)
       while (vp) {
          snprint_value(buf, 128, vp->name, vp->name_length, vp);
          th_answ[cx].buf = buf;
          vp = vp->next_variable;
     }
  }
  else{
    th_answ[cx].flag = 2;
  }
  th_answ[cx].an = false;
  SOCK_CLEANUP;
}
==========================================
th_answ -- глобальная структура.  Так вот собственно в чем  у меня проблема : программа работает довольно стабильно лишь на 200 - 300 запусков приходиться одно зависание на thread join'e . Не могу понять почему может где косяк в коде , посоветуйте что нибудь.
    Спасибо.

  • thread + snmp(asynchapp), !*! fura13, 15:32 , 27-Июл-04 (1)
    Все нашел! В ф-ции ассинхронного приема
    if (pdu->errstat == SNMP_ERR_NOERROR)
           while (vp) {
              snprint_value(buf, 128, vp->name, vp->name_length, vp);
              th_answ[cx].buf = buf;
              vp = vp->next_variable;
         }
    А если в пакете есть ошибка то этот случай не отрабатывается и th_answ[cx].buf непонятно чему равна вот из-за этого были "зависания".
    Тема закрыта.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру