Суть проблемы в следующем. По порту приходит смешанный поток данных: RTP поток и команды от оборудования. В своей программе я создал 2 потока и в обоих потоках ловлю события от порта при помощи select(). Вот настройка первого потока, который должен вылавливать RTP из порта: select() задается вполне стандартно:
select(n, readfds, writefds,exceptfds, p_timeout);
При создании сокета добавляю SO_REUSEADDR:
*sock = socket(af, SOCK_DGRAM, IPPROTO_UDP);
if (*sock == -1)
return RETURN_ERROR(get_native_netos_error());
else {
int32_t val = 1;
sock_setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
2й сокет в другом потоке открывается также, как и первый и тоже биндится без ошибок:
if ((s = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
return -1;
}
yes = 1;
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (uint8 *) &yes, sizeof (yes)) < 0) {
close (s);
return -1;
}
Оба сокета открываются, у обоих положительные дескрипторы, но сообщения приходят только на один сокет почему-то. Хотя я на нем читаю эти сообщения с флагом MSG_PEEK специально, чтобы эти же сообщения оставлять для второго сокета, который для RTP предназначен, но этого почему-то не происходит:
len = recvfrom(serv, &req[0], 128, MSG_PEEK,(struct sockaddr *) &rem_serv, &serv_from_len);
if (bytes_parse(req, len, &my_struct) != P_SUCCESS)
return P_FAILURE;
len = recvfrom(serv, &req[0], len, 0,(struct sockaddr *) &rem_serv, &serv_from_len);
То есть, 1-м recvfrom читаю сообщение и оставляю его в буфере, если это команда (не RTP), я его читаю еще раз, чтобы удалить из буфера, а если RTP, то просто выхожу из обработчика и его, по идее, должен как раз 2-й поток прочитать, но этого не происходит. Помогите, кто чем может.