Port aus anderem Netzwerk erfahren ???



  • Hallo,

    Der Titel beschreibt schon etwas meine Frage. Hier aber mal ein paar mehr Details.

    Ich habe in einem Netzwerk einen Server programmiert. Dieser empfängt Daten von Geräten die aber in einem anderen Netzwerk sind. Die Daten kommen also an einem Port in dem der Server ist an. Wenn ich nun aber einen Befehl an die Geräte schicken möchte benötige ich die IP-Adresse und den Port an den ich den Befehl sende. Die IP Adresse erfahre ich bereits durch inet_ntoa( . . . );.

    Wie kann ich nun den Port herausfinden an den ich in dem anderen Netzwerk senden muss? Wird dieser auch in der struct sockaddr mitgesendet? Geht das überhaupt diesen aus einem anderen Netzwerk zu erfahren?

    Danke schonmal.

    Gruß 🙂



  • Verwendest du UDP (klingt zumindest so)?
    Dann steht alles in der erhaltenen sockaddr, und du kannst die direkt wieder als Empfänger angeben (brauchst also inet_ntoa usw. gar nicht zu bemühen).
    Wenn du TCP benutzt, kannst du die sockaddr, welche dir accept liefert, prinzipiell verwerfen, wenn du die Informationen nicht anderweitig verwenden möchtest, da der zurückgegebene Socket selbst weiß, wo er die Daten hinschicken muss.

    Jamaram schrieb:

    Wie kann ich nun den Port herausfinden an den ich in dem anderen Netzwerk senden muss? Wird dieser auch in der struct sockaddr mitgesendet? Geht das überhaupt diesen aus einem anderen Netzwerk zu erfahren?

    Das geht, wenn du das immer noch unbedingt möchtest, über das sin_port Attribut der sockaddr_in Struktur.

    Diverse Referenzen zum Nachschlagen:
    MSDN: sockaddr_in
    MSDN: accept (TCP)
    MSDN: recvfrom (UDP)
    MSDN: sendto (UDP)

    Die sockaddr* sind jeweil sockaddr_in*, die einfach gecastet wurden.
    Als Größe wird dann einfach sizeof(sockaddr_in) angegeben.
    Das hängt damit zusammen, dass die Funktionen auch IPv6 unterstützen
    und man da einfach sockaddr_in6 verwendet:

    MSDN: sockaddr_in6



  • Vielen Dank erstmal.

    Aber ist das dann der Port des anderen Netzwerks? Es ist doch eigentlich nur der Port von dem Netzwerk in dem sich der Server befindet?! Oder sehe ich das falsch? 😕



  • Deine Frage ist vollig falsch gestellt...bitte versuche es nochmal! Kein *** weis was Du meinst....



  • Was zu Geier ist das für ein Port des Netzwerks? 😃 🙄



  • Er meint den Port des Clients, der sich mit seinem Server verbindet.



  • Du solltest zuerst mal die Frage beantworten: UDP oder TCP!?

    Bei UDP: Pech
    Bei TCP; einfach mit "send" Daten zurücksenden.



  • Entschuldigt bitte das ich erst jetzt antworte.

    Ich hab es aber jetzt hinbekommen. Es läuft bei mir alles über TCP.

    Es war von mir ein bisschen doof formuliert. Sorry 😞

    Es ging nur darum das die Geräte ja ausserhalb des Netzwerkes sind in dem sich der Server befindet und ich nicht richtig wusste wie ich die Geräte dann quasi wieder ansprechen kann wenn ich ihnen einen Befehl senden möchte. Dazu benötigte ich ja die Socket Daten des Gerätes. Das das Gerät( ausserhalb des Netzwerks) ja auch an einem Port lauscht um Daten zu empfangen, wollte ich nur wissen wie ich diesen Speichern kann beim ersten mal wenn das Gerät Daten sendet, d.h. IP Adresse und Port. Das steht ja alles in der struct sockaddr drin .
    Ich habe es schließlich so gelöst das ich die dann jetzt zwischenspeicher und bei Bedarf diese mir heraushole und meinen Befehl an das Gerät senden kann.

    Danke an DrakoXP, hast mir einen kleinen Denkanstoß gegeben 😉

    Gruß

    Jamaram



  • Kapier ich nicht, was Du da schreibst... Du verwendest TCP, somit kapier ich das nicht...



  • Was genau verstehst du denn nicht? 😕
    Bitte erklärs mir damit ich es vielleicht verstehe. Der Fehler liegt ja wahrscheinlich bei mir?!

    In der sockaddr_in werden doch die Daten vom Client gespeichert wenn ich ihn per accept(socket,(sockaddr*)&sin,&lin) akzeptiere. Diese speichere ich dann zwischen und wenn ich wieder etwas an diesen Client senden möchte nutze ich die zwischengespeicherten sockaddr_in Daten für diesen Client.



  • Schwachsinn, wie ich bereits in meiner ersten Antwort schrieb.

    accept liefert dir einen Socket zurück. Diesen gibst du immer bei send() und recv() and und dann kann dir die sockaddr gänzlich egal sein.
    Was machst du denn aktuell mit dem Rückgabewert von accept? Ignorieren?
    accept gibt dir im Erfolgsfall wie bereits erwähnt einen gültigen Socket zurück,
    den du je nach Betriebssystem mit close oder closesocket wieder freigeben musst.
    Wenn dein Server lange genug läuft und du die Sockets immer offen lässt,
    kracht es irgendwann in der Form, dass accept dir meldet, dass es keine Verbindungen mehr annehmen kann.



  • Beim TCP die getpeername(sock,sockaddr&,size&) Funktion liefert client info. Also beim UDP, wenn du connect().



  • saperounlogged schrieb:

    Beim TCP die getpeername(sock,sockaddr&,size&) Funktion liefert client info. Also beim UDP, wenn du connect().

    WHAT?

    Seit wann benutzt man bei UDP connect?

    Ich meine, ja, es geht, aber... das is genau so wie bei TCP die sockaddr aufzuheben, damit man auch Daten zurückschicken kann...



  • TCP funktioniert über Router-Grenzen hinweg. Deshalb ist die Info in dem sockaddr total sinnlos, da der Rückkanal nur geht, wenn die Client-Seite die Verbindung aufbaut...
    Also, nimm den Rückgabewert von "accept" und gut ist... alles andere ist für mich unverständlich und funktioniert i.d.R. nur im gleichen Netzwerksegment.


Anmelden zum Antworten