Socketport herausfinden (Unix UDP socket)



  • Hallo zusammen,

    ich habe folgenden Code

    int s;
    	struct sockaddr_in clientAddr,serverAddr;
    	serverAddr.sin_family=AF_INET;
    	serverAddr.sin_port=INADDR_ANY;
    	serverAddr.sin_addr.s_addr=INADDR_ANY;
    	clientAddr.sin_family=AF_INET;
    	s = socket(AF_INET, SOCK_DGRAM, 0);
    	bind(s, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
    	sendto(s,data.data(),data.size(),0,(struct sockaddr *)&clientAddr,sizeof(clientAddr));
    

    Wenn ich nach sendto serverAddr.sin_port aufrufe ist das immer noch 0. Wie kann ich den Port herausfinden der zum senden genommen wurde? Der sende Port sollte immer zufällig sein deshalb serverAddr.sin_port=INADDR_ANY;. Brauche aber für das empfangen von Packete den port über den vorher gesendet wurde.

    Ich hoffe ihr könnt mir weiterhelfen.



  • Keine C++ Frage.

    mrno schrieb:

    Der sende Port sollte immer zufällig sein deshalb serverAddr.sin_port=INADDR_ANY;.

    Warum erwartest du dieses Verhalten? Kann man das nachlesen? Das wäre mir nämlich neu.



  • Das Programm soll auf verschiedenen Rechnern laufen und keine Standardports benutzen (TFTP-Server). Daher habe ich gelesen, dass serverAddr.sin_port=INADDR_ANY mir einen zufälligen freien Port beim Senden gibt. Gibt es sonst eine andere Möglichkeit einen freien Port über 1024 zu erfahren? Will es nicht fest einstellen, da es sein kann das der Port schon von einem anderen Programm benötigt wird. Brauche aber im Nachhinein den Port um auf diesem zu lauschen. So funktioniert leider tftp laut rfc1350.



  • Ich habe das bind() völlig übersehen. Da hast du Recht, es wird ein freier Platz ausgesucht. Es gibt eine Möglichkeit das zu erfahren, allerdings bin ich mir gerade nicht mehr ganz sicher wie das war. Ich suche mal.

    Aha: http://stackoverflow.com/questions/4046616/sockets-how-to-find-out-what-port-and-address-im-assigned
    port muss auch 0 sein und nicht INADDR_ANY, auch wenn INADDR_ANY wahrscheinlich eh 0 ist.



  • Vielen Dank, hat funktioniert.


Log in to reply