UDP Socket, Client IP ermitteln



  • Hallo,

    ich versuche mich aktuell an UDP Sockets.

    Dies ist der Code:

    void createSocket(){
    	int _socket = socket(AF_INET,SOCK_DGRAM,0);
    
    	if(_socket == -1){
    		cout << "Fehler bei der Socket Erstellung";
    		return;
    	}
    
    	socklen_t len;
    	char mesg[1000];
    
    	sockaddr_in serverAdress;
    	serverAdress.sin_family = AF_INET;
    	serverAdress.sin_port = htons(5025);
    	memset(&serverAdress.sin_zero,0,8);
    
    	if(bind(_socket, reinterpret_cast<sockaddr *>(&serverAdress), sizeof(serverAdress)) == -1){
    		cout << "Fehler beim Binden des Sockets";
    		return;
    	}
    
    	recvfrom(_socket,mesg,1000,0,(struct sockaddr *)&serverAdress,&len);
    	cout << (struct sockaddr *)&serverAdress << endl;
    
    }
    

    Mit dieser Zeile versuche ich die IP auszugeben:
    cout << (struct sockaddr *)&serverAdress << endl;

    Dies kann natürlich nicht klappen, da dies die Speicheraddresse ausgibt.
    Leider steht in meinem C++ Buch nichts drin, wie ich davon den Wert ermittel 😞

    Die IP wollte ich nutzen, um dies an eine Funktion zu übergeben. Oder kann ich auch einfach (struct sockaddr *)&serverAdress übergeben?

    Hat einer eine Idee?



  • // Ungetestet
    std::cout << static_cast<int>(serverAdress.sin_addr.s_b1) << "."
              << static_cast<int>(serverAdress.sin_addr.s_b2) << "."
              << static_cast<int>(serverAdress.sin_addr.s_b3) << "." 
              << static_cast<int>(serverAdress.sin_addr.s_b4);
    

    Innerhalb von sockaddr_in (https://msdn.microsoft.com/en-us/library/zx63b042.aspx) befindet sich sin_addr vom Typ in_addr (https://msdn.microsoft.com/de-de/library/windows/desktop/ms738571%28v=vs.85%29.aspx). Dieser beinhaltet wiederum 4 char s, die den einzelnen mit Punkt getrennten Werten der IP-Adresse entsprechen.

    Das gilt vermutlich nur unter Windows, laut der Manpage ip(7) (http://man7.org/linux/man-pages/man7/ip.7.html, Abschnitt "Adress Format") enthält in_addr unter Linux nur ein uint32_t. Da müsste man die Bytes mit den Shiftoperatoren herausholen.



  • Kann ich sin_addr, nicht auch irgendwie an eine Funktion übergeben?

    Heißt also, dass ich "(struct sockaddr *)&serverAdress" in einer anderen Methode nutzen möchte. Ich weiß allerdings nicht welcher Datentyp es ist und wie ich die Referez an eine andere Funktion übergebe um dort die sendTo Methode auszuführen. Oder muss ich einfach serverAdress übergeben mit dem Typ sockaddr_in?

    (kann es gerade nämlich nicht testen :))



  • Ja, du kannst das sockaddr_in an die sendTo-Funktion übergeben.

    Noch Tipps zum Code:
    Das memset kannst du dir sparen, wenn du

    sockaddr_in serverAdress = {};
    

    schreibst.
    Anstatt eines char-Arrays würde ich einen std::vector<char> oder ein std::array<char> verwenden. Dann musst du dir nicht immer die Buffergröße merken.




Anmelden zum Antworten