MAC-Adresse + WakeOnLan
-
Hi,
da ich bisweilen erfolglos gesucht hab, wollt ich mich mal an euch wenden.
Ich würde gerne die MAC Adresse eines PC's (anhand der IP (das geht wahrscheinlich nur wenn er läuft, oder kann man das irgendwie über die routing table vom router herausbekommen?)) herausfinden um diesen dann über WakeOnLan starten zu können.
Ich weiss wie sich das MagicPacket zusammen setzt (6 volle bytes und dann 16x die MAC Adresse der Netzwerkkarte), allerdings weiss ich nicht wie ich den Code wirklich schreiben soll.
Brauche ich RAW Sockets, oder gehts auch über UDP?
hab mir bisher mal das hier hingekritzelt, aber wollte lieber fragen ob jemand eine Funktion hat die sicher funktioniert, denn das rumprobieren ist mühsam und man weiss auch nicht ob mans jetzt komplett falsch macht oder obs schon in die richtige Richtung geht

int Network::WakeOnLan(const char* ipOrHost) { // würde eigentlich gerne über ipOrHost die MAC rausfinden falls möglich, // aber es würde mir reichen wenns über die MAC Adresse schonmal gehen würde :/ char magicPacket[102+1]={0}; for (int i=0; i<6; ++i) magicPacket[i] = 255; char macAdress[] = {0x00, 0x02, 0xE3, 0x05, 0xAD, 0x12, 0 }; for (int i=0; i<16; ++i) strncpy(magicPacket+6+i*6, macAdress, 6); SOCKET s; s=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addr; addr.sin_family=AF_INET; addr.sin_port=htons(9); GetAddrFromString(ipOrHost, &addr); long rc=sendto(s, magicPacket, 102, 0, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)); closesocket(s); return rc!=SOCKET_ERROR; }hier noch GetAddrFromString
long GetAddrFromString(const char* hostnameOrIp, SOCKADDR_IN* addr) { if (!addr) return SOCKET_ERROR; unsigned long ip = inet_addr(hostnameOrIp); if (ip!=INADDR_NONE) { addr->sin_addr.s_addr = ip; return 0; } else { HOSTENT* he=gethostbyname(hostnameOrIp); if (!he) return SOCKET_ERROR; else memcpy(&(addr->sin_addr),he->h_addr_list[0],4); return 0; } }was für mich gerade ein kleines problemkind ist, denn wie solls funktionieren wenn der Zielrechner aus ist Oo.
Wäre dankbar wenn mir jemand eine funktionierende Lösung anbieten könnte da ich momentan garnicht weiss wie ichs überhaupt angehen sollte
-
Hallo K1ro
Du hast einen Fehler beim Zusammenbauen des MagicPackets. Strncpy betrachtet die 0x00 in der MAC-Adresse als Stringende. Du solltest memcpy verwenden.
UDP sollte funktionieren. Als Empfangsadresse sollte jedoch imho eine Broadcast-Adresse verwendet werden.Gruss Chris
-
erstmal danke für den hinweis mit strncpy,
ich dachte das bei strNcpy er einfach soviel kopiert wie ich ihm als grösse angeb' ohne die '\0' zu betrachtenbei einer Broadcast Adresse würd ich doch aber alle Rechner innerhalb meines Subnetzes ansprechen, sehe ich das richtig ?
-
k1ro schrieb:
ich dachte das bei strNcpy er einfach soviel kopiert wie ich ihm als grösse angeb' ohne die '\0' zu betrachten
Aus meiner Boland-Hilfe:
strncpy kopiert bis zu maxlen Zeichen des über src angegebenen Strings in dest. Dabei schreibt strncpy immer genau maxlen Zeichen. Wenn also src weniger als maxlen Zeichen enthält, wird eine entsprechende zusätzliche Anzahl von Nullzeichen in dest angehängt. Wenn src mehr als maxlen Zeichen umfaßt, bleibt der nach dest kopierte String ohne abschließendes Nullzeichen.k1ro schrieb:
bei einer Broadcast Adresse würd ich doch aber alle Rechner innerhalb meines Subnetzes ansprechen, sehe ich das richtig ?
Ansprechen: ja
Wecken: nur denjenigen, dessen MAC-Adresse im MagicPacket stehtGruss Chris
-
Chrisi_K schrieb:
Aus meiner Boland-Hilfe:
strncpy kopiert bis zu maxlen Zeichen des über src angegebenen Strings in dest. Dabei schreibt strncpy immer genau maxlen Zeichen. Wenn also src weniger als maxlen Zeichen enthält, wird eine entsprechende zusätzliche Anzahl von Nullzeichen in dest angehängt. Wenn src mehr als maxlen Zeichen umfaßt, bleibt der nach dest kopierte String ohne abschließendes Nullzeichen.aahhh, vielen dank

Chrisi_K schrieb:
Ansprechen: ja
Wecken: nur denjenigen, dessen MAC-Adresse im MagicPacket steht
Gruss Chrisah, natürlich das hab ich grad garnicht in betracht gezogen *hand an die stirn schlag*
ok, dann wär ja schonmal fast alles geklärt (fehlt nurnoch mac adresse herausfinden ^^ aber das war erstmal nicht so wichtig)
vielen dank für die Hilfe bisher!
-
Evtl. hilft dir hier noch was von:
http://tangentsoft.net/wskfaq/advanced.html#macaddr