URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3209
[ Назад ]

Исходное сообщение
"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 , 27-Июл-04 15:32 
Все нашел! В ф-ции ассинхронного приема
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 непонятно чему равна вот из-за этого были "зависания".
Тема закрыта.