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.




Log in to reply