Frage

Ich schreibe einen UDP-Test-Client / Server, und ich will es durch die Firewall erhalten. Angeblich soll alles, was ich tun muß, ist auf beiden Seiten in die richtigen IP und Server schicken. Ein Angebot IP kein Problem, aber wie ich habe Pick den Client ein zufällig frei Port und es den Benutzer melden? Ich schließlich möchte es zu einem Heiratsvermittler-Server verbinden, aber jetzt muss ich einen einfachen funktionierenden Prototyp, und ich möchte die Portnummer cout so mein Freund / Tester mir die # via IM senden können, so können wir testen.

Wie bekomme ich die Port-Nummer? sorry für die lange ab. Ich merke Leute sagen mir nicht zu tun, was ich fragen, wenn ich gebe nicht einen desc: (

War es hilfreich?

Lösung

den hochtechnisierten Begriff verwenden, das ist eigentlich ein ziemlich eklig Problem oder sogar ein Paar von ekligen Problemen. Je nach Konfiguration des Firewall, wird es in der Regel Antworten von einem anderen Endpunkt auf dem Endpoint IP ermöglichen, als die Anfrage kam. Also ... wenn Sie Freund des UDP-Datagramm mit so etwas wie der recvfrom() Systemaufruf empfängt, werden die Adressparameter die IP-Endpunktinformationen zu reagieren empfangen. So sollte das andere Ende mit einem sendto() reagieren können das gleiche Adressierungsinformationen verwendet wird. So etwas wie:

/* initiator */
struct sockaddr_in hisaddr;
memset(&hisaddr, 0, sizeof(hisaddr));
hisaddr.sin_addr.s_addr = htonl(target_ip);
hisaddr.sin_port = htons(target_port);
sendto(sd, msg_ptr, msg_sz, 0, (struct sockaddr*)&hisaddr, sizeof(hisaddr));

/* receiver */
struct sockaddr_in peeraddr;
socklen_t peer_sz = sizeof(peeraddr);
recvfrom(sd, buf_ptr, buf_sz, 0, (struct sockaddr*)&peeraddr, &peer_sz);
/* build response */
sendto(sd, msg_ptr, msg_sz, 0, (struct sockaddr*)&peeraddr, peer_sz);

Die peeraddr auf der anderen Seite werden Ihre externe Adresse oder, richtiger gesagt, die IP-Adresse der Firewall und die Port-Nummer, die sie benutzen wollten. Die Portnummer, die Sie in Ihrem Code angeben kann ganz anders sein als der Hafen, dass Ihr Freund, Daten senden müßte. Letztlich könnte es keine Rolle, welchen Port Sie verwenden, da die Firewall auf einem ganz anderen Port könnte das Senden und Empfangen - das ist, was Network Address Translation geht. Ich würde empfehlen, RFC3235 Lesen für einige Tipps, wie man diese Hürde zu überwinden.

Der beste Ansatz IMHO ist:

  1. Lassen Sie das Betriebssystem einen Port entweder telefonisch bind() mit einer Null Portnummer oder Überspringen der bind insgesamt
  2. Nachdem der Client die Adressinformationen aus dem Socket Layer (zB der fünfte und sechste Argumente recvfrom() )
  3. Der Client sendet Antwort auf den Endpunkt im vorherigen Schritt abgerufen
  4. Tweak die Firewall-Konfigurationen, bis die vorherigen Schritte funktionieren

Natürlich sind alle von der Magie sind im letzten Schritt. Wenn Sie NAT deaktivieren oder stellen Sie sicher, dass der Firewall nie Ports wechseln wird, dann nach unten Nageln eine Portnummer und bind-ing, es so gut funktioniert. Vielleicht haben Sie einen Blick auf %WINDIR%\system32\drivers\etc\services nehmen wollen (oder /etc/services auf Ihrem O Neigung abhängig) eine Vorstellung davon zu bekommen, was Portnummern reserviert sind oder allgemein in Gebrauch ist.

Andere Tipps

Generell - Sie - als Entwickler - die Port wählen. Sie können Ihre Anwendung setzen Sie den Port aus einer Konfigurationsdatei oder Benutzereingaben zu lesen - aber keine magische Firewall wird Ihnen sagen, was Port zu verwenden ...

Wenn ich Ihre Frage richtig zu verstehen, ich bin nicht sicher, ob ein Weg, es zu tun, was Sie wollen programmatisch (und selbst wenn es, ich glaube nicht, es ist der richtige Ansatz). Ich glaube, Sie brauchen einen Port zu finden, die nicht im Einsatz auf dem Server-Rechner (und vielleicht eine andere oder die gleiche Port auf dem Clientcomputer, wenn die Kommunikation bidirektional ist), und dass Port muss in der Lage sein, durch die Firewall passieren . Ich gehe davon aus, da Sie sagen, „immer eine IP ist kein Problem“, haben Sie bereits Ihre Firewall konfiguriert einige oder alle Ports auf einen bestimmten Computer innerhalb der Firewall zu übermitteln? Wenn ja, ist der Port, den Sie suchen eine von denen, die Sie weitergeleitet. Sie können nur eine willkürliche, so lange wählen, wie kein anderer Dienst auf diesem Port läuft. Ports unter 1024 sind reserviert, so dass Sie wollen wahrscheinlich eine höhere Zahl als die zur Auswahl. Sie können einen einfachen Portscanning-Tool wie nmap , um zu sehen, welche Dienste auf Ihrem Computer Ports, auf denen ausgeführt werden und eine andere holen einer. Beachten Sie, dass nmap durch Firewalls und verschiedene bind Regeln täuschen, wenn Steckdosen erstellt werden.

Ich glaube, du bist besser dran, einen festen Anschluss Kommissionierung eher auf die zufällige Portnummer gewählt als Berufung durch das O / S.

Wenn Sie einen zufälligen Port verwenden würden Sie Ihre Firewall-Einstellungen jedes Mal Sie das Programm ausführen ändern.

Wenn Sie mit WINSOCK Prüfung auf diesen Link: http://msdn.microsoft.com/en-us /library/aa280717(VS.60).aspx Grundsätzlich haben Sie die Wahl zwischen 2 den Port auf 0 gesetzt und lassen Sie das System weisen Sie einen oder wählten ein gelegentliches man versuchen, den Sockel zu öffnen, wenn es nicht eine andere (unbedingt meiden reservierten Ports) funktioniert versuchen

bind () der Steckdose, bevor Sie Ihre Daten senden. Geben Sie Port 0 zu binden () und das Betriebssystem wird einen nicht verwendeten Port für Sie wählen. Sie können dann mit getsockname (), um herauszufinden, was Port wsa gewählt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top