Re: Socket bind: Port-Wiederverwendung

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



Vielleicht noch als Ergänzung:

serverSock.Close();
kann ich nicht einfach so aufrufen, weil ich ja das BeginAccept() aufgerufen
hatte und das läuft munter als eigener Thread weiter. Da lässt sich wohl der
Socket auch nicht sauber löschen/schließen.

Wie lässt sich das BeginAccept wieder stoppen/zurücknehmen?


"Oliver Braun" <oliBraun2355522@xxxxxxxxxxx> schrieb im Newsbeitrag
news:%237l$c8NSGHA.524@xxxxxxxxxxxxxxxxxxxxxxx
Danke Günter, für die ausführliche Antwort.

Ich hatte schon befürchtet, dass ich was falsch mach:

Zuerst hatte ich das in meiner "Zerstör"/"Lösch"-Routine:
if (serverSock.Connected) serverSock.Close();
serverSock = null;

Dann hab ich das versucht:
if (serverSock.Connected) serverSock.Close();
serverSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.IP);


Wie muss ich denn den Socket richtig löschen, damit er garantiert weg ist?
Eine Dispose-Methode finde ich nicht...



"Günter Prossliner" <g.prossliner/gmx/at> schrieb im Newsbeitrag
news:e$En74NSGHA.256@xxxxxxxxxxxxxxxxxxxxxxx
Hallo Oliver!

Wenn ich mit einem Socket auf eingehende Verbinmdungen lauschen will,
dann ruf ich zuvor die Bind-Methode des Sockets auf, um den lokalen
Port anzugeben, auf dem ich lauschen möchte.
Wenn ich nach getaner Arbeit das Socket-Objekt zerstöre und wieder
einen neuen Socket aufmache, der auf dem gleichen Port lauschen soll,
dann bekomme ich beim Bind die Fehlermeldung

Was heisst für Dich "zerstören"? (code)

"Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse
oder Anschluss) nur jeweils einmal verwendet werden"

Das deutet darauf hin, dass der Socket _nicht_ richtig "zerstört" worden
ist.

Ist zwar komisch, weil ich den Port ja durch das zerstören des
Sockets schon wieder freigegeben habe, aber ich habe irgendwo mal
gelesen, dass Windows die Ports nach Gebrauch für ein paar Minuten
sperrt.

Was Du meinst ist die Geschichte mit dem TIME_WAIT Status. Damit hatte
ich auch schon zu kämpfen. Das kann allerdings nur dann zutreffen wenn:

Du mehrere tausend Verbindungen zu einem Host relativ schnell machst
Wenn Du der Client bist (.Connect und nicht .Listen)

Es muss wirklich immer der gleiche Host sein! Bei Verbindungen zu einem
anderen Host macht es nichts. Das liegt daran, dass die Kombination von
Ziel-IP und Host als "Primärschlüssel" in Winsock fungieren.

Ausserdem bist Du der Server.

Jetzt hab ich etwas herumgespielt und festgestellt, dass der Port so
lange gesperrt bleibt, wie meine Applikation selbst läuft. Sobald ich
die stoppe und neu starte, kann ich den Port sofort wieder verwenden.

Weil Windows beim Prozess-Ende alle Handles schliesst. Dazu gehört auch
der Socket.

- Wer verwaltet den Port: das Betriebssystem oder das .NET-Framework?

Prinzipiell das System. Das .Net Framework stell entsprechende Klassen
zur Verfügung mit deren Hilfe sich Sockets in gewohnter .Net Manier
verwenden lassen. Ich will jetzt nicht das Wort "Wrapper-Klasse"
verwenden, allerdings verwenden die .Net Sockets die zugrundeliegenden
Windows - Sockets. Solche Ressourcen werden ja prinzipiell vom System
verwaltet (auch wenn Du z.B. c++ nimmst).

- Wie kann ich per Code einen Port wieder zur erneuten Verwendung
freigeben, wenn ich mein Socket-Objekt gelöscht habe, dass den Port
benutzt hat?

Wie hast Du diesen "gelöscht"?



mfg GP





.



Relevant Pages

  • Re: why are docs so out of date?
    ... For example, in the UDPSocket class, there is no mention of the send ... UDP socket class ... Binds the socket to port on host. ...
    (comp.lang.ruby)
  • Re: pickle problem
    ... lib "socket" class, which apparently uses slots. ... self.sock.connect((host, port)) ... # pickle self as a (host, ... some child processes from the parent and use IPC to send the ...
    (comp.lang.python)
  • Re: Testing for Internet Connection
    ... Troeger Thomas wrote: ... import socket, struct ... Check for connectivity to a certain host. ... sock.connect((host, port)) ...
    (comp.lang.python)
  • Buffer size when receiving data through a socket?
    ... I wrote some pretty basic socket programming again, but I'm still confused about what's happening with the buffer_size variable. ... Here are the server and client programs: ... address = (host, port) ...
    (comp.lang.python)
  • Re: Socket bind: Port-Wiederverwendung
    ... Port anzugeben, ... Sockets schon wieder freigegeben habe, ... Es muss wirklich immer der gleiche Host sein! ... Das .Net Framework stell entsprechende Klassen zur ...
    (microsoft.public.de.german.entwickler.dotnet.csharp)