Warum ist Port eine Zeichenfolge und keine Ganzzahl?

103

Die PortMethode gibt eine Zeichenfolge und keine Ganzzahl zurück. Was ist der Grund dafür und ist es sicher, dem Port ":" voranzustellen?

R3turnz
quelle

Antworten:

143

Dies liegt daran, dass nach dem Doppelpunkt entweder eine Portnummer oder ein Dienstname angezeigt werden kann.

Das folgende Beispiel ist gültig, wenn der Dienstname anstelle einer Portnummer verwendet wird:

listener, err := net.Listen("tcp", "localhost:https") // port 443
// ...

Die Portzuordnung für einen bestimmten Dienst kann mithilfe von nachgeschlagen werden net.LookupPort. Auf Unix-Systemen wird die /etc/servicesDatei für die Zuordnungen bezogen.

Tim Cooper
quelle
1
Ich bin immer fasziniert von der Dichotomie zwischen offenem und geschlossenem Typ. Ich würde gerne so etwas wie einen gemischten Typ sehen, bei dem es einige Standardeinstellungen gibt (hier z. B. bekannte Ports und Dienste), die aber auch erweitert werden können, um letztendlich die automatische Vervollständigung zu unterstützen. In meinen begrenzten Kenntnissen kommen TypeScripts-ADTs am nächsten, vielleicht können Swifts-ADTs dies auch direkt ausdrücken.
Stefan Hanke
0

Für eine Zahl ist der Standardwert 0: wenn eine Funktion

 func (u * URL) Port () string

Die Rückgabe-Nummer anstelle des Stichs lautet 0

Port 0 ist ein reservierter Port in TCP / IP-Netzwerken. Dies bedeutet, dass er nicht in TCP- oder UDP-Nachrichten verwendet werden sollte. Port 0 hat jedoch eine besondere Bedeutung bei der Netzwerkprogrammierung, insbesondere bei der Unix-Socket-Programmierung: zum Anfordern von vom System zugewiesenen dynamischen Ports.

Es ist notwendig, in mehreren Funktionen zu programmieren

Fadid
quelle
Gibt in libGURL url.port()einen String zurück ... aber GURL bietet auch url.has_port(). Theoretisch könnten wir also unterscheiden http://example.com:/path(hat einen Port, ist aber port()eine leere Zeichenfolge) von http://example.com/path(hat keinen Port). Natürlich macht GURL das nicht! Es wird sogar berichtet, dass http://example.com:80/path"kein Port vorhanden ist", da der explizit angegebene Port für das Schema redundant ist. Was verrückt ist , aber egal ... Punkt ist, Stringist nicht Optional. Kombiniere sie nicht.
Quuxplusone