J'écris une application de multidiffusion simple. J'ai l'intention de l'exécuter sur localhost.adresse IP multicast - bloqué dans l'appel à recvfrom
je l'ai fait ce qui suit:
char *maddr;
.
.
.
sendfd = socket(...);
struct sockaddr_in sasend;
sasend.sin_family = AF_INET;
sasend.sin_port = htonl(portno);
inet_ntop(maddr, &(sasend.sin_addr.s_addr));
struct sockaddr_in sarecv;
memcpy(&sarecv, &sasend);
recvfd = socket(...);
const int on = 1;
setsockopt(recvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); // can you explain why
// this is needed
bind(recvfd, &sarecv);
struct ip_mreq mreq;
memcpy(&mreq.imr_multiaddr, &(sasend.sin_addr));
mreq.imr_interface = htonl(INADDR_ANY);
setsockopt(recvfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
char flag = 1;
setsockopt(sendfd, IPPROTO_IP, IP_MULTICAST_LOOP, &flag, 1);
if (fork() == 0) {
while (recvfrom(recvfd)) {
}
}
else {
while (sendto(sendfd)) {
sleep(3);
}
}
dans le code réel je vérifie les valeurs de retour de tous les appels système. le problème est que recvfrom ne retourne pas. le processus reste bloqué dans l'appel à recvfrom.
J'ai essayé d'exécuter deux instances du programme sur des coques différentes. ça n'aide pas.
J'ai également essayé de placer l'indicateur de bouclage à 0, cela n'aide pas.
Je veux exécuter les deux programmes de localhost. L'adresse de diffusion groupée que j'utilise est 239.255.1.2 que j'ai vu du livre
Je pense que nous pouvons utiliser n'importe quelle adresse de classe D lorsque nous faisons l'appel setsockopt requis.
connexion sur le port 1025
en cours d'exécution du noyau 2.6.25
linuxaussi comment puis-je vérifier si le support a été compilé multicasting dans le noyau.
Mise à jour:
i ajouter a la route -net 224.0.0.0 240.0.0.0 dev netmask eth0 sur la coquille. toujours le problème existe.
est la question trop descriptive? –