Hallo und ein frohes Neues!,
ich habe leider überhaupt keine Erfahrung mit Netzwerken und Netzwerkprogrammierung. Habe nun die Doku und einige (zugegebenermaßen meistens nicht sehr hilfreiche, weil direkt von der Doku abgekupferte) Tutorials zu SDL_net gelesen und stehe immer wieder vor dem gleichen Problem.
Gewollt ist: Möglichkeit für ein Spiel einen Server im lokalen Netzwerk zu erstellen, der automatisch allen anderen Mitspielern angezeigt wird.
Problem ist:
Nur TCP: Um die IP-Adresse des Servers zu erhalten, müsste man den Host-Namen kennen, den die anderen Computer ja nicht kennen.
Mit TCP und UDP: Eine eingegebene IP-Adresse müsste man ja mittels SDLNet_Write32() passend umwandeln können, um sie in SDL_net zu benutzen. Aber es wäre höchst unpraktisch, wenn jeder Spieler die IP-Adresse des Servers eingeben müsste.
Eventuelle Lösung: Aus UDP-Paket Vektoren wurde ich nicht ganz schlau. Anscheinend muss man ihnen ja keine Adressen auf channels zuweisen und sie werden trotzdem gesendet und empfangen. Kann man bei einem empfangenen Vektor aus UDP-Paketen die Herkunftsadresse auslesen? Wenn das so funktioniert, wäre das die Lösung, um den Server allen anderen Computern im lokalen Netzwerk vorzustellen. Wenn das nicht geht, wäre ich sehr verbunden, falls jemand weiß, woher die Computer die IP-Adresse oder den Host-Namen des Servers beziehen sollen.
Schonmal vielen Dank fürs durchlesen, ich hoffe jemand kann mir helfen.
[SDL_net] IP-Adresse im loklen Netzwerk bekannt geben
- B.G.Michi
- Establishment
- Beiträge: 163
- Registriert: 07.03.2006, 20:38
- Alter Benutzername: B.G.Michi
- Kontaktdaten:
Re: [SDL_net] IP-Adresse im loklen Netzwerk bekannt geben
ich habe leider keine Ahnung von SDL_net. Aber mit Winsock hab ich das vor einiger Zeit mal hingehackt.
das passende Stichwort wäre wohl die Broadcast-Message. Wenn du per UDP eine Nachricht an die Adresse 255.255.255.255 schickst wird diese an alle Computer im Netzwerk gesendet (wenn ich mich richtig erinnere). Jetzt kann also der Client eine "ich suche server"-Message an den Server schicken, der daraufhin die "hier ist ein server"-Message zurückschickt oder der Server schickt immer wieder mal eine "hier ist ein server"-Nachricht und die Clients warten bis sie diese erhalten.
hoffe ich konnte helfen
JFF_B.G.Michi
das passende Stichwort wäre wohl die Broadcast-Message. Wenn du per UDP eine Nachricht an die Adresse 255.255.255.255 schickst wird diese an alle Computer im Netzwerk gesendet (wenn ich mich richtig erinnere). Jetzt kann also der Client eine "ich suche server"-Message an den Server schicken, der daraufhin die "hier ist ein server"-Message zurückschickt oder der Server schickt immer wieder mal eine "hier ist ein server"-Nachricht und die Clients warten bis sie diese erhalten.
hoffe ich konnte helfen
JFF_B.G.Michi
Re: [SDL_net] IP-Adresse im loklen Netzwerk bekannt geben
Ja, laut google klingt das so, als könnte das wirklich funktionieren. Das werde ich die Tage testen und mich dann hier nochmal melden. Schonmal vielen Dank! Ka, wie ich diese Besonderheit hätte selbst herausfinden sollen.
EDIT: Ok, ich bin schon auf ein erstes Problem gestoßen. Ich muss sämtliche IP-Adressen angeben, von denen Pakete empfangen werden können:
http://sdl.beuc.net/sdl.wiki/SDLNet_UDP_Bind
Also muss ich die IP-Adresse des Servers kennen, um sie zu empfangen. Das ist ja irgendwie - schlecht. :evil: Ich versteh einfach nicht, wieso außer mir scheinbar niemand jemals ein Problem mit dem Ganzen gehabt hat. Nirgends steht etwas zu dem Thema.
EDIT: Ok, ich bin schon auf ein erstes Problem gestoßen. Ich muss sämtliche IP-Adressen angeben, von denen Pakete empfangen werden können:
http://sdl.beuc.net/sdl.wiki/SDLNet_UDP_Bind
Also muss ich die IP-Adresse des Servers kennen, um sie zu empfangen. Das ist ja irgendwie - schlecht. :evil: Ich versteh einfach nicht, wieso außer mir scheinbar niemand jemals ein Problem mit dem Ganzen gehabt hat. Nirgends steht etwas zu dem Thema.
Re: [SDL_net] IP-Adresse im loklen Netzwerk bekannt geben
Das glaube ich nicht, Tim. Um via UDP/IP etwas empfangen zu können, muss man nur einen (an einen lokalen Port gebundenen) Socket haben, und den mit der entsprechenden Methode abfragen (unter Berkeley-Sockets wäre das recvfrom). Alles andere sind zusätzliche Filter von SDLNet und damit optional. Setze doch einfach mal die address.host des UDPpacket beim SDLNet_UDP_Send auf INADDR_BROADCAST. ;)Felian hat geschrieben:Ich muss sämtliche IP-Adressen angeben, von denen Pakete empfangen werden können
Re: [SDL_net] IP-Adresse im loklen Netzwerk bekannt geben
Ja, ich glaube jetzt habe ich den Dreh raus. Muss wahrscheinlich halt noch ein paar Tage warten, bis ich das Ganze an einem echten Netzwerk testen kann. Bevor ich es aber teste nochmal eine Frage. Folgendes steht im SDL_net-Quelltext:
Wird address automatisch bis zur Ankunft mit der Herkunftsadresse befüllt, oder muss ich da noch irgendwie nachhelfen?
EDIT: Mir ist auch gerade aufgefallen, dass es sinnvoller ist, das System umzudrehen und die Clients broadcasten zu lassen, den der Server hat ja einen festen Port über den er erreichbar ist und sie nicht.
Code: Alles auswählen
typedef struct {
int channel; /* The src/dst channel of the packet */
Uint8 *data; /* The packet data */
int len; /* The length of the packet data */
int maxlen; /* The size of the data buffer */
int status; /* packet status after sending */
IPaddress address; /* The source/dest address of an incoming/outgoing packet */
} UDPpacket;
EDIT: Mir ist auch gerade aufgefallen, dass es sinnvoller ist, das System umzudrehen und die Clients broadcasten zu lassen, den der Server hat ja einen festen Port über den er erreichbar ist und sie nicht.