Winsock2 Broadcast nachricht



  • hallo liebe Community,

    ich habe ein Lan Chat programmiert. Bei diesem Gibt es einen Host, der Alle Nachrichten empfängt und weiterleitet. SO nun muss man wenn man auf den Host verbinden will seine IP-Adresse eingeben.

    Gibt es eine Möglichkeit dies zu umgehen und wie z.B. bei manchen Spielen der Fall ist, dass ein Server gesucht wird. (mir wurde hier gesagt, dass der Server dazu eine Broadcast Message) versenden muss). Weiß jemand wie ich das realisiere und wie ich diese Nachricht dann mit dem Client verwalten kann. Ich habe schon alle möglichen Seiten die google ausspuckt durchgeschaut, doch bsi jetzt noch keine LÖsung gefunden.

    Ein danke im VOrraus

    Mit freundlichen Grüßen Heeiiigou



  • wins? ddns? dns?



  • Um deine im Internet gültige IP rauszubekommen kannst du z.B. folgende Anfrage

    GET / HTTP/1.1\r\nUser-Agent: Network Info\r\nHost: checkip.dyndns.org\r\n\r\n
    

    an "checkip.dyndns.org" auf Port 80 senden. Dann die Antwort des Servers auswerten, fertig.

    siehe: http://checkip.dyndns.org



  • Ich brauche eine Lösung für ein LAN Netzwerk, welche mir ermöglicht, dass Clienten auf einen bestimmten "Punkt/Adresse" schauen ob ein Server existiert. Und der Server an diesen "punkt/Adresse" Daten, wie z.B. die IP Adresse von sich sendet, um eine direkte Verbindung herstellen zu können. Kann mir jemand einen Hinweis/Link/Quellcode/etc. zeigen wo man sieht, wie ein solcher Vorgang funktioniert. MIr wurde schon gesagt, dass man das mit einer "Broadcast" Message bewerkstelligen kann, ich habe jedoch nichts dazu gefunden.





  • Da ich der Ansicht bin, vorgekautes Essen schmeckt am Besten, hier mein Lösungsansatz.

    Um den Server zu finden, ohne manuell suchen zu müssen, musst du Gebrauch vom User Datagram Protocol machen (UDP). Das ist ein Verbindungsloses Protokoll, bei dem Daten auch ins "Nichts" geschickt werden können.

    Dazu musst dein Server über UDP (beispielsweise jede Sekunde) einen Broadcast absenden. Das funktioniert wie folgt (der gute, alte Quick-And-Dirty-Weg):

    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    char broadcast = '1';
    setsockopt(g_UdpSocket, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(char));
    
    struct sockaddr_in sockAddr;
    memset(&sockAddr, 0, sizeof(struct sockaddr_in));
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_addr.s_addr = INADDR_BROADCAST;
    sockAddr.sin_port = htons(DEIN_LIEBLINGS_PORT);
    

    Der Code bewirkt folgendes: Es wird ein UDP Socket erstellt und für ihn das SO_BROADCAST Feature aktiviert. Damit darf er über INADDR_BROADCAST (255.255.255.255) Daten versenden.
    Dann kannst du mit sendto eine Dummy Nachricht versenden. In der Nachricht kann irgendein Sch*** stehen, hauptsache, sie wird versenden:

    char data[256];
    sendto(sock, data, sizeof(char[256]), 0, (struct sockaddr*) &sockAddr, sizeof(struct sockaddr_in));
    

    Dein Client muss jetzt einen UDP Listener implementieren. Das funktioniert in etwa so:

    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    
    struct sockaddr_in sockAddr;
    memset(&sockAddr, 0, sizeof(struct sockaddr_in));
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_addr.s_addr = INADDR_ANY;
    sockAddr.sin_port = htons(DEIN_LIEBLINGS_PORT);
    bind(sock, (sockaddr*) &sockAddr, sizeof(struct sockaddr_in));
    

    Und, damit du überhaupt Daten empfangen kannst, muss du (idealerweise in einem Thread) alle eingehenden Daten, die über deinen Lieblingsport laufen, "abholen".

    DWORD WINAPI ReceiveThread(void* unused) {
    	while (true) {
    		struct sockaddr_in remote;
    		int remoteLen = sizeof(struct sockaddr_in);
    		int bytesReceived;
    		char buffer[256];
    
    		bytesReceived = recvfrom(sock, buffer, WAVE_BUFFER_SIZE, 0, (struct sockaddr*) &remote, &remoteLen);
    		if (bytesReceived > 0) {
    			char* address = inet_ntoa(remote.sin_addr);
    		}
    	}
    
    	return 0;
    }
    

    [code="cpp"]

    Und im Handumdrehen kannst du aus remote die Ip Adresse auslesen.
    Im Anschluss kannst du dann zum Beispiel TcpStartup(address) (oder wie auch immer du sie genannt hast) aufrufen (die du, deiner Aussage nach, ja bereits implementiert hast) und schwuppdiwupp verbindet sich dein Client automatisch mit dem Server und kann Nachrichten an ihn versenden.


Anmelden zum Antworten