The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"thread + snmp(asynchapp)"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"thread + snmp(asynchapp)"
Сообщение от fura13 emailИскать по авторуВ закладки(ok) on 26-Июл-04, 16:08  (MSK)
       Здраствуйте.
Возникли проблемы с асинхронным отправкой/приемом 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 . Не могу понять почему может где косяк в коде , посоветуйте что нибудь.
    Спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "thread + snmp(asynchapp)"
Сообщение от fura13 emailИскать по авторуВ закладки(ok) on 27-Июл-04, 15:32  (MSK)
Все нашел! В ф-ции ассинхронного приема
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 непонятно чему равна вот из-за этого были "зависания".
Тема закрыта.
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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