У меня есть следующая проблема: я хочу записать данные потокового сервера на сокет UDP на конкретном порту, и клиенты должны иметь возможность подключиться к нему и получать отправляемые данные без особых хлопот: они просто подключаются, и с момента запуска они должны получать данные, используя recvfrom
с сервера.
У меня проблемы с настройкой сетевых компонентов. Итак, вот пример кода, который я пытаюсь заставить работать:
int udpSock = socket(AF_INET, SOCK_DGRAM, 0);
if(udpSock == -1)
{
perror("Could not create audio output socket");
exit(1);
}
struct sockaddr_in *sin = (struct sockaddr_in*)&gOutgoingAddr;
sin->sin_port = htons(40200);
if(bind(udpSock, (const sockaddr*)sin, sizeof(struct sockaddr_in)) == -1)
{
perror("Cannot bind audio socket");
exit(1);
}
int buffer_size = 0;
char* data = get_next_buffer(&buffer_size);
while(buffer_size > 0)
{
if(sendto(udpSock, (const void*)(data), buffer_size, 0, NULL, 0) == -1)
{
perror("sendto failure");
}
data = get_next_buffer(&buffer_size);
}
Не беспокойтесь о переменной gOutgoingAddr, она получается правильно с помощью getifaddrs
, она действительна. Я обеспокоен параметризацией метода sendto
, потому что сейчас вывод приложения:
sendto failure: Destination address required
Это правда, потому что у меня нет адреса назначения, поскольку все примеры, которые я нашел до сих пор, показывают, когда сервер получает соединение с клиентом, и есть адрес. Но так как у меня еще нет подключенного клиента, я все еще хочу выйти в эфир.
Я ценю всю помощь, я понятия не имею, что Ishould поставить для параметров sendto:
- gOutgoingAddress, который является адресом, где я создаю сокет? Я пробовал это, но если я использую команду
tcpdump
linux на указанном порту, я ничего не получаю.
- Должен ли я создать многоадресный сокет? Это как-то бессмысленно ...
- Что-то еще?
Спасибо,
FRC