J'ai le problème suivant ici: Je veux écrire un serveur de streaming de données sur un socket UDP sur un port spécifique, et les clients devraient pouvoir s'y connecter et recevoir les données qui sont envoyées sans trop beaucoup de tracas: ils se connectent juste, et à partir du moment où ils commencent, ils devraient obtenir des données en utilisant recvfrom
du serveur.Diffusion en continu sur UDP
J'ai quelques problèmes avec la mise en place des parties liées au réseau. Donc, voici un morceau rugueux de code que j'essaie de faire le travail:
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);
}
Ne vous inquiétez pas la variable gOutgoingAddr, il est obtenu en utilisant correctement getifaddrs
, il est valide. Je suis troublé en ce qui concerne la paramétrisation de la méthode sendto
, becasue en ce moment la sortie de l'application est:
sendto failure: Destination address required
Ce qui est vrai, parce que je n'ai pas une adresse de destination, puisque tous les exemples que j'ai trouvé jusqu'à présent afficher quand le serveur obtient une connexion client, et il y a l'adresse. Mais comme je n'ai pas encore de client connecté, je voudrais toujours diffuser.
Je vous remercie de toute l'aide, je ne sais pas ce que iShould mis pour les paramètres de sendto:
- Le gOutgoingAddress qui est l'adresse où je crée la prise? J'ai essayé ceci, mais si j'utilise la commande
tcpdump
linux sur le port spécifié, je n'ai rien. - Dois-je créer une socket de multidiffusion? Cela n'a aucun sens ...
- Quelque chose d'autre?
Merci, frc
La multidiffusion est prise en charge par de nombreux routeurs (si ce n'est la plupart) modernes. Ce sont les fournisseurs de services Internet qui peuvent ne pas le supporter. Par exemple, voir [La BBC, Virgin Radio, EMAP et GCAP ont commencé à diffuser leur radio via Multicast] (http://www.bbc.co.uk/multicast/radio/index.shtml). –
Je ne parlais pas de routeurs Internet backbone dans ma réponse. Je parlais de l'équipement typique des réseaux domestiques et de petite entreprise, qui ne prend pas en charge la multidiffusion IPv4, sans tenir compte du fait qu'il ne prend pas en charge la multidiffusion de couche 2 (Ethernet) et utilise la diffusion pour les adresses multicast. – Mecki