Socket Verbindung zu mehreren IPs - elegante Methode?



  • Hey,

    ich moechte so eine Art Server bauen, der ueber sockets mit zahlreichen Clients kommuniziert. Die Clients haben halt - wie gewoehnlich - staendig wechselnde IP-Adreessen.

    Zur Zeit erstelle ich im Server nach jeder Client-Anfrage einen neuen socket, um dem Client zu antworten:

    bool createSocket(char* IP)
    {
    	// Creating socket
    	sendSocket = socket(AF_INET, SOCK_DGRAM, 0);
    
    	if (sendSocket == -1)
    	{
    		printf("EthernetSender.init(): creating a socket failed\n");
    		return false;
    	}
    
    	sendAddress.sin_family = AF_INET;
    	sendAddress.sin_port = htons(1337);
    	sendAddress.sin_addr.s_addr = inet_addr(IP);
    
    	bzero((sendAddress.sin_zero), 8);
    
    	setsockopt(sendSocket, SOL_SOCKET, SO_BROADCAST, (void *) &broadcastPermission, sizeof(broadcastPermission));
    
    	return true;
    }
    

    Dieser Code wird also fuer jeden Client immer und immer wieder aufgerufen. Wir reden hier uebrigens von mobilen Clients (zB Handys), dh deren IP-Adressen koennen sich auch mal schnell waehrend der Sitzung aendern. [Die IP-Adresse des Servers ist hingegen immer konstant, aber das spielt hier glaub ich fuer das Problem keine Rolle]

    Gibt es da moeglicherweise eine elegantere Methode? Zum Beispiel einen Socket erstellen und dessen IP-Adresse im Nachhinein aendern? Oder was ganz anderes? Broadcast geht uebrigens nicht, da haengt zuviel Internet dazwischen.



  • Vermutlich hast du einen Denkfehler...

    schnapphase2 schrieb:

    Die Clients haben halt - wie gewoehnlich - staendig wechselnde IP-Adreessen.

    Woher weiß der Server die Adressen, wenn sie ständig wechseln?

    schnapphase2 schrieb:

    Zur Zeit erstelle ich im Server nach jeder Client-Anfrage einen neuen socket, um dem Client zu antworte.

    Wenn der Client eine Anfrage sendet, warum antwortest du nicht auf der gleichen Verbindung?
    Mit was für nem Protokoll fragt der Client denn an?



  • Hi!

    Der Client meldet sich pro Minute einmal beim Server und hinterlaesst da seine IP Adresse in der Datenbank.

    Der Server sendet kontinuierlich Daten an Clients, die mit validem Timestamp in der DB stehen. Das heisst, der Server kriegt nur die Info "IP Adresse so.und.so will Daten". Daher mache ich halt zur Zeit immer nen neuen Socket auf fuer jede Datenuebertragung. Der Zielport ist immer gleich. Daher auch meine Ueberlegung, einmal einen socket aufzumachen und dessen Ziel-IP staendig wechseln zu koennen...

    Protokoll ist in beiden Richtungen UDP.



  • Hi,..

    Wenn du Dein eigenes Protokoll bastelst, könntest Du doch auch eine SessionID vergeben. Somit ist es egal von welcher IP sich der Client meldet wenn dieser sich dann mit der SessionID authentifiziert.

    Grüße



  • Warum verwendest Du nicht einfach die sendto Funktion. Du benutzt, wenn ich dies richtig gesehen hast eh UDP und da benutzt man meist ungebundene Sockets. Mit sendto kannst Du dann immer ein und den selben Socket nehmen und übergibst halt in den Parametern, wo das ganz hingehen soll.


Log in to reply