检查 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 中的内容,以防万一,但如果有人知道可能出了什么问题,我将不胜感激。