linux - fionbio - socket connect nonblock



Multicast-IP-Adresse-im Aufruf von recvfrom blockiert (1)

Ich schreibe eine einfache Multicast-Anwendung. Ich beabsichtige, es auf localhost auszuführen.

Ich habe Folgendes getan:

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);
  }
}

Im aktuellen Code prüfe ich die Rückgabewerte aller Systemaufrufe. Das Problem ist, dass recvfrom nicht zurückkehrt. Der Prozess bleibt beim Aufruf von recvfrom blockiert.

Ich habe versucht, zwei Instanzen des Programms auf verschiedenen Shells auszuführen. Es hilft nicht.

Ich habe auch versucht Loopback Flag auf 0, es hilft nicht.

Ich möchte beide Programme von localhost ausführen.

Die Multicast-Adresse, die ich verwende, ist 239.255.1.2, die ich aus dem Buch gesehen habe. Ich denke, wir können jede Adresse der Klasse D verwenden, da wir den erforderlichen setsockopt-Aufruf machen.

Anschluss an Port 1025

laufender Linux Kernel 2.6.25

Außerdem überprüfe ich, ob Multicasting-Unterstützung in den Kernel kompiliert wurde.

Aktualisierung :

Ich habe Route-Add 224.0.0.0 Netmask 240.0.0.0 dev eth0 auf der Shell. immer noch existiert das Problem.


ok ich habe die Firewall deaktiviert und ich konnte das Programm laufen lassen. habe Hilfe von hier bekommen

jetzt mehr Probleme:

  • wie man Regeln zu der Firewall hinzufügt, um speziell meinen Code auszuführen
  • Wenn ich Loopback nicht deaktiviere, dann bekomme ich nicht die Nachrichten von einem anderen Prozess, der auf derselben Multicast-Gruppe sendet, und wenn ich es aktiviere, dann empfängt mein Prozess die Nachrichten, die er überträgt. Das liegt daran, dass ich beide Programme auf localhost laufe. gibt es einen Weg herum.




multicast