Broadcast Problem / 2 IP Adressen eines Computers
-
Ich versuch grad eine kleine Netzwerk Engine zu machen.
Dabei soll ein UDP-Broadcast im lokalem Netzwerk mögliche Server finden.Mein Hauptrechner hängt in einem WLAN Netz, was am Internet angebunden ist. Dann hab ich noch meinen Laptop, der ist über ein normales Netzwerkkabel mit meinem Hauptrechner verbunden.
IPs Netzwerk
Laptop 192.168.0.3
Hauptrechner 192.168.0.1IPs WLAN Netzwerk
Hauptrechner 192.168.178.30
andere Rechner 192.168.178.xIch schick prinzipiell ein UDP Broadcast raus, und die "betroffenen" antworten mit einem UDP sendto an die IP Adresse von der der Broadcast kam.
Starte ich einen Broadcast vom Laptop aus, dann antwortet mein Hauptrecher wie gewünscht. (An die IP Adresse, die er vom Absender des Broadcastes kennt - 192.168.0.3)
Starte ich allerdings einen Broadcast von meinem Hauptrechner, dann kann der Laptop mit sendto nix schicken, weil angeblich der Absender des Broadcasts die IP Adresse 192.168.178.30 anstatt 192.168.0.1 ist...
Hat jemand eine Ahnung, was ich machen könnte, um die korrekte IP heraus zu finden?
Einziger Ausweg, den ich zur Zeit sehe ist jede Broadcast Anfrage mit einer Broadcast Antwort zu beantworten. (Oder wenigstens die, die nicht geschickt werden können.)
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
der 192.168.178.30 scheint wohl sowas wie ein repeater für broadcasts zu sein?

wie auch immer, häng' in die udp-pakete einfach die ip-adresse des absenders mit dran. die 4 bytes fallen nicht ins gewicht und sie sollten auch nicht verändert werden.
andere möglichkeit: ARP anfragen abschicken...

-
Undertaker schrieb:
der 192.168.178.30 scheint wohl sowas wie ein repeater für broadcasts zu sein?

wie auch immer, häng' in die udp-pakete einfach die ip-adresse des absenders mit dran. die 4 bytes fallen nicht ins gewicht und sie sollten auch nicht verändert werden.
andere möglichkeit: ARP anfragen abschicken...

Dann funktioniert das Ganze natürlich nichtmehr über ein NAT.
Bei Broadcasts sollte es nicht weiter problematisch sein (da die sowieso normalerweise nicht durch das NAT gehen), aber man sollte generell das verschicken von IP Adressen und/oder Portnummern vermeiden.Hätten sich z.B. die Designer von FTP daran gehalten wäre allen Firewall und Router Herstellern eine Menge Arbeit erspart geblieben

@Samuel Plentz: die Absender Adresse (IP + Port) in einem UPD Packet darf eigentlich nicht verändert werden, auch von Repeatern nicht. Einzig ein NAT darf diese verändern, nur muss es dann Antworten auch auf der veränderten IP entgegennehmen und entsprechend weiterleiten, damit das ganze für die Anwendung transparent bleibt.
Wieso du also auf dem Laptop eine IP siehst an die du nicht antworten kannst ist mir irgendwie schleierhaft. Oder antwortest du vielleicht mit einer fixen Portnummer? Das könnte ein Problem sein... in dem Fall versuch' mal an die Portnummer zu antworten von der das Paket gekommen ist.
-
Also zuerst einmal vielen Dank für die schnellen Antworten
, und Sorry fürs falsche Forum.@Undertaker
An IP Adresse anhängen hatte ich gedacht, aber ich bekomme nur die 192.168.178.30 zurück, wenn ich die IP abfrage. Meine IP Abfrage:HOSTENT* Host; Host=gethostbyname(Hostname;Wie mach ich eine ARP Abfrage in CPP?
@hustbaer
Ich schick eigentlich direkt an den Absender zurück, hier der betreffende Code:Initialisierung:
SOCKADDR_IN addr; a.s_UDP=socket(AF_INET,SOCK_DGRAM,0); if(a.s_UDP==INVALID_SOCKET) Fehler... addr.sin_family=AF_INET; addr.sin_port=htons(a.Port+1); addr.sin_addr.s_addr=ADDR_ANY; long rc=bind(a.s_UDP,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc==SOCKET_ERROR) Fehler...Broadcast-Anfrage nach Servern im Netzwerk
long rc; char buf[256]; SOCKADDR_IN addr; a.s_UDP_Broadcast=socket(AF_INET,SOCK_DGRAM,0); if(a.s_UDP_Broadcast==INVALID_SOCKET) Fehler... addr.sin_family=AF_INET; addr.sin_port=htons(a.Port+1); addr.sin_addr.s_addr=inet_addr("255.255.255.255"); setsockopt(a.s_UDP_Broadcast,SOL_SOCKET,SO_BROADCAST,"True",5); strcpy_s(buf,"1"); rc=sendto(a.s_UDP_Broadcast,buf,strlen(buf),0,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc==SOCKET_ERROR) Fehler...Nachrichtenhandling: (wird in einer Schleife ständig ausgeführt)
FD_SET fdSet; FD_ZERO(&fdSet); FD_SET(a.s_UDP,&fdSet); FD_SET(a.s_UDP_Broadcast,&fdSet); timeval t; t.tv_sec=0; t.tv_usec=0; long rc=select(0,&fdSet,0,0,&t); if(rc==SOCKET_ERROR) Fehler... if(rc==0) return; if(FD_ISSET(a.s_UDP,&fdSet)){ // UDP-Socket meldet sich char buf[256]; char buf2[300]; SOCKADDR_IN addr; SOCKADDR_IN remoteAddr; int remoteAddrLen=sizeof(SOCKADDR_IN); rc=recvfrom(a.s_UDP,buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen); if(rc==SOCKET_ERROR) Fehler... buf[rc]='\0'; GString Y=buf; if(Y=="1"){ // Server Anfrage sprintf_s(buf2,"2%s",a.ServerString.c_str()); rc=sendto(a.s_UDP,buf2,strlen(buf2),0,(SOCKADDR*)&remoteAddr,remoteAddrLen); if(rc==SOCKET_ERROR) Fehler... // hier tritt der Fehler auf... (WSAGetLastError==#10065 - WSAEHOSTUNREACH) // WSAEHOSTUNREACH: No route to host. // A socket operation was attempted to an unreachable host. // See WSAENETUNREACH. // WSAENETUNREACH: Network is unreachable. // A socket operation was attempted to an unreachable network. // This usually means the local software knows no route to reach // the remote host. cout<<rc<<" Bytes gesendet!\n"; } } if(FD_ISSET(a.s_UDP_Broadcast,&fdSet)){ // Server meldet sich für die Serverliste char buf[256]; char buf2[300]; SOCKADDR_IN addr; SOCKADDR_IN remoteAddr; int remoteAddrLen=sizeof(SOCKADDR_IN); rc=recvfrom(a.s_UDP_Broadcast,buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen); if(rc==SOCKET_ERROR) Fehler... buf[rc]='\0'; GString Y=buf; GString Z=Y.Left(1); if(Z=="2"){ Y.Delete(0); cout<<"Server gefunden:\n"; cout<<"IP: "<<getIP(remoteAddr)<<"\n"; cout<<"Beschreibung: "<<Y; } }
-
Noch ein paar Tests haben ergeben:
Im WLAN Netzwerk kommt es zu keinen Problemen. Dort finden sich die Server.
Wenn ich das WLAN deaktiviere, gibt es auch keine Probleme mit dem Laptop.
Wenn ich beide Netze habe finde ich auf dem Hauptrechner selbst 2 Server. Wenn ich das WLAN deaktiviere finde ich auf dem Hauptrechner nur einen Server.