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 непонятно чему равна вот из-за этого были "зависания". Тема закрыта.
|