0

检查 pjsip 的套接字选择的性能,我发现超时的行为非常奇怪。socket_select.c 中的源代码如下:

struct timeval os_timeout, *p_os_timeout;

PJ_CHECK_STACK();

PJ_ASSERT_RETURN(sizeof(pj_fd_set_t)-sizeof(pj_sock_t) >= sizeof(fd_set),
                 PJ_EBUG);

if (timeout) {
os_timeout.tv_sec = timeout->sec;
os_timeout.tv_usec = timeout->msec * 1000;
p_os_timeout = &os_timeout;
} else {
p_os_timeout = NULL;
}

return select(n, PART_FDSET_OR_NULL(readfds), PART_FDSET_OR_NULL(writefds),
      PART_FDSET_OR_NULL(exceptfds), p_os_timeout);

我已经检查过了,传递给 select 函数的所有参数都是正确的,并且超时值总是在选择后重新初始化为正确的值。n 如果还设置为最大使用的文件描述符。

问题是,有时,超时被正确触发并以 0 退出,但有时,它会被阻塞一段随机时间(从几毫秒到几分钟),也返回 0。

我目前正在检查每个 fd_set 中的内容,以防万一,但如果有人知道可能出了什么问题,我将不胜感激。

4

1 回答 1

0

问题很可能不在 socket_select.c 中。你从哪里调用选择?您是否使用多个线程并从另一个线程调用 select?您可以发布您的代码或提供链接吗?

于 2012-10-25T02:03:23.927 回答