UDP Broadcast
-
Hi! Ich bin gerade dran einen Broadcast über UDP zu senden, um die IP-Adressen der registrierten Maschinen auszulesen.
Ich habe mich maldurch gelesen und es war immer die Rede von
setsockopts(), jedoch weiß ich nicht wie das funktiert. Kennt ihr vielleicht ein gutes Tutorial, wo das mit den Broadcasts gut erklärt ist ?
Danke
-
die broadcast-adresse berechnet sich etwa so: eigene_ip_adresse | ~subnet_mask
oder du sendest einfach an 255.255.255.255
-
Hi! Danke für deine Antwort, das Problem aber bei der ganzen sache ist, das ich immer nur eine Maschine empfange obwohl mehrere Senden.
Das müsste dann wahrscheinlich an meiner Empfangsroutine für die Sockets liegen oder habt ihr eine andere Idee?
-
^^die müssen alle auf der gleichen portnummer senden, dann sollteste auch mehrere empfangen. broadcasts werden von 'nem OS etwas stiefmütterlich behandelt. wenn zu viel los ist, oder du zu selten pakete abholst, gehen die auch schon mal verloren.
-
Die Sache ist, dass ich eine Maschine im Netztwerk habe dessen Antwort ich erhalte beim Broadcast mit 255.255.255.255.
Jedoch habe ich noch eine simulierte Maschine auf meiner IP laufen, von der bekomme ich nur eine Antwort wenn ich ein Broadcast auf localhost sende.
Eigentlich müsste sich doch diese auch melden, da ja alle angesprochen werden, wenn ich auf 255.255.255.255 anfrage.
-
SOCKET broad; sockaddr_in addr; int lCheck; int broadcast=1; broad=socket(AF_INET,SOCK_DGRAM,0); if(broad==INVALID_SOCKET) { throw Exceptions("Fehler: Der Socket konnte nicht erstellt werden!"); } unsigned long ip; addr.sin_family=AF_INET; addr.sin_port=htons(61005); addr.sin_addr.s_addr = INADDR_BROADCAST; mTelegr.SetDaten(""); mTelegr.telegrammkopf_senden(0,"MI",0,0,"00000","C@-0000","read.xml");//intern wird so in der Maschin broadcast anfrage gesendet lCheck=setsockopt(broad,SOL_SOCKET, SO_BROADCAST,(char *)&broadcast,sizeof(broadcast)); lCheck=sendto(broad,mTelegr.string_aus_struct().c_str(), 16,0,(struct sockaddr*)&addr,sizeof(addr)); if(lCheck==SOCKET_ERROR) { throw Exceptions("Konnte Datei nicht senden!"); } char buf[MAXDATARECV+1]; string str=""; memset(buf,0,MAXDATARECV+1); int len; len=sizeof(addr); lCheck=recvfrom(broad,buf,MAXDATARECV+1,0,(struct sockaddr*)&addr,&len); if(lCheck<0) throw Exceptions("Fehler beim Empfangen!"); else { for(int i=0;i<lCheck;i++) { str=str+buf[i]; } } closesocket(broad);
Das ist hier der Code, wenn ich jetzt das simulierte anfragen will dann hängt er bei recvfrom da er wahrscheinlich nichts zurück bekommt
-
UDP_newbie schrieb:
Jedoch habe ich noch eine simulierte Maschine auf meiner IP laufen, von der bekomme ich nur eine Antwort wenn ich ein Broadcast auf localhost sende.
sowas wie vmware? dann liegts bestimmt an der konfiguration.
-
Die simulierte Maschine ist eher ein Client Programm, dass später mal auf einen eigenen Rechner laufen soll. Die Sache ist, dass dieses client Programm nur dann antwortet, wenn ich es direkt mit localhost anspreche. Ich kann da auch nichts konfigurieren. Bei einem Broadcast antwortet dieses nicht.
Ich habe auch mal über einen Netzwerk sniffer mir das angeschaut, der antwortet da auch nicht. Liegt es etwa daran, dass das Programm auf dem Rechner läuft, von dem auch der Broadcast kommt.
-
UDP_newbie schrieb:
Die simulierte Maschine ist eher ein Client Programm, dass später mal auf einen eigenen Rechner laufen soll. Die Sache ist, dass dieses client Programm nur dann antwortet, wenn ich es direkt mit localhost anspreche.
schon seltsam. schon mal mit 'ner subnet-spezifischen broadcast adresse versucht?
schon mal die SO_BROADCAST-option beim empfänger gesetzt (eigentlich braucht man sie nur beim sender, aber vielleicht isses'n versuch wert)?
benutzt du irgendso'n komisches OS wie vista oder mac-OSx? bei vista z.b. könnt ich mir gut vorstellen, das sowas zickt, wiel da vieles gewaltig zickt.
-
Willst du wirklich Broadcasts oder doch nicht eher Multicast ?