Здраствуйте.
Возникли проблемы с асинхронным отправкой/приемом 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 . Не могу понять почему может где косяк в коде , посоветуйте что нибудь.
Спасибо.
Все нашел! В ф-ции ассинхронного приема
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 непонятно чему равна вот из-за этого были "зависания".
Тема закрыта.