Я пытаюсь построить анализатор метрик RTP-пакетов в C, но я столкнулся со странной проблемой, я сокращаю детали реализации для простоты раскрытия:
Поскольку пакеты RTP содержатся в UDP, мой сокет инициализируется со следующими параметрами:
sock_domain = AF_INET;
sock_type = SOCK_DGRAM;
sock_proto = IPPROTO_UDP;
и связан с этими параметрами:
socket_addr.sin_family = AF_INET;
socket_addr.sin_port = 10000; // My server is streaming on 10000
socket_addr.sin_addr.s_addr = INADDR_ANY;
и присоединился к многоадресной группе:
mgroup_req.imr_multiaddr.s_addr = inet_addr("224.1.0.1"); // Multicast group of the stream
mgroup_req.imr_interface.s_addr = INADDR_ANY;
установить группу многоадресной рассылки, из которой я получаю:
mgroup_addr.sin_family = socket_addr.sin_family;
mgroup_addr.sin_port = socket_addr.sin_port;
mgroup_addr.sin_addr.s_addr = mgroup_req.imr_multiaddr.s_addr;
получение пакетов с функцией recvfrom:
errcode = recvfrom(sockfd, &recvbuff, IPMAXSIZE, 0, (struct sockaddr *)&mgroup_addr, &mgroup_addr_len)
Что-то идет не так, хотя я могу получать стандартные пакеты UDP, адресованные многоадресной группе 224.1.0.1
, пакеты RTP не принимаются в первый раз, но их повторная отправка делает свое дело.
Сценарий 1:
Я отправляю n UDP-пакеты: они правильно получены
Сценарий 2:
Я отправляю n RTP-пакетов: ничего не происходит
Я снова отправляю те же n RTP-пакеты: они правильно получены
Какое бы количество n пакетов не было ... так странно, но это правда.
редактирование:
На стороне анализатора я запускаю анализатор, который показывает оба пакета, поэтому сообщения поступают на сторону анализатора, это не проблема, связанная с отправителем.
Вопрос:
код точно такой же (читай: тот же исполняемый файл) для сценария RTP И сценария UDP.
Что я делаю не так?
Примечания:
RTP-библиотеки управления или высокоуровневые RTP-библиотеки - нет-нет, я ДОЛЖЕН работать на этом уровне абстракции из-за метрик, которые мне нужно проанализировать.
Кроме того, анализатор сетевых показателей запрещен, я ДОЛЖЕН сделать это с помощью своего собственного кода.
Заранее спасибо.