Forum: PC-Programmierung TCP-Port schließen


von tcp (Gast)


Lesenswert?

Hallo,
ich programmiere in c++ unter Linux Mint Mate (Ubuntu) eine Art TCP/IP 
Chat. Beim Testen wird gelegentlich die Zeile
1
//Schließe Verbindung und Socket
2
close(sock);
nicht ausgeführt. Das Programm ist zu, aber der Port ist noch offen. 
Solange der Port offen ist, kann ich das Programm nicht mehr starten, 
bis ich den Rechner neustarte. Ich weiß, dass man den Port irgendwie 
nachträglich schließen / freigeben kann, sodass man ihn wieder benutzen 
kann. Ich finde den Befehl aber nicht mehr. Bis jetzt habe ich folgendes 
probiert:
1
#Command1:
2
sudo iptables -A INPUT -p tcp --dport 13050 --tcp-flags ALL SYN -j DROP
3
sudo iptables -A INPUT -p tcp --dport 13050 --tcp-flags ALL SYN -j ACCEPT
4
5
6
#Command2:
7
sudo iptables -A INPUT -p tcp --dport 13050 --tcp-flags ALL SYN -j ACCEPT
8
sudo iptables -A INPUT -p tcp --dport 13050 --tcp-flags ALL SYN -j DROP
9
10
11
#Command3:
12
sudo iptables -A INPUT -p tcp --dport 13050 -j ACCEPT
13
14
15
#Command4:
16
sudo ufw deny 13050
17
sudo ufw allow 13050
18
19
20
#Command5:
21
sudo netstat -ap | grep :13050 #Hab ich nach 'ner Minute abgebrochen
22
23
24
#Command6:
25
fuser -k -n tcp 13050

Ich weiß, dass es den Befehl gibt, da ich ihn vor Monaten benutzt habe. 
Aber welcher ist es?

kann mir jemand helfen?

Danke.

von Konrad S. (maybee)


Lesenswert?

Schau dir mal unter "man 7 socket" den Eintrag "SO_REUSEADDR" an.

von tcp (Gast)


Lesenswert?

Hat sich erledigt. Der Fehler lag ganz woanders.

von tcp (Gast)


Lesenswert?

Konrad S. schrieb:
> Schau dir mal unter "man 7 socket" den Eintrag "SO_REUSEADDR" an.

Trotzdem Danke!

von Cle (Gast)


Lesenswert?

Und wo lag der Fehler?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

tcp schrieb:
> Das Programm ist zu, aber der Port ist noch offen.

Diesen Zustand gibt es übrigens nicht.  Es ist Aufgabe des OS, alle
vom Prozess verwendeten Ressourcen bei dessen Beendigung freizugeben.

von Daniel A. (daniel-a)


Lesenswert?

Jörg Wunsch schrieb:
> tcp schrieb:
>> Das Programm ist zu, aber der Port ist noch offen.
>
> Diesen Zustand gibt es übrigens nicht.

Den hatte ich unter linux schon oft. Einfach zu reprodizieren: einen 
Socket öffnen, mindestens eine tcp-verbindung damit aufbauen, ein 
SIGSEGV verursachen während die Verbindung noch nicht geschlossen wurde. 
Resultat: ein für circa 2 minuten blockierter Port der zu keinem prozess 
mehr gehört...

tcp schrieb:
> Ich weiß, dass man den Port irgendwie nachträglich schließen / freigeben
> kann, sodass man ihn wieder benutzen kann. Ich finde den Befehl aber
> nicht mehr.

Wenn es soeinen befehl gibt, brauch ich den auch...

von Peter II (Gast)


Lesenswert?

Daniel A. schrieb:
> Resultat: ein für circa 2 minuten blockierter Port der zu keinem prozess
> mehr gehört...

das ist normal und auch so gewollt, ein Listen socket geht beim 
schließen auf Time-Wait. Dafür musst du das Programm auch nicht killen, 
das passiert auch beim normalen Close.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Daniel A. schrieb:
>>> Das Programm ist zu, aber der Port ist noch offen.
>> Diesen Zustand gibt es übrigens nicht.
>
> Den hatte ich unter linux schon oft.

Nein, der Port ist nicht mehr „offen“, sondern im Zustand TIME_WAIT.

Dagegen hilft übrigens auch das close() nicht.

man tcp

von Rolf M. (rmagnus)


Lesenswert?

Peter II schrieb:
> Daniel A. schrieb:
>> Resultat: ein für circa 2 minuten blockierter Port der zu keinem prozess
>> mehr gehört...
>
> das ist normal und auch so gewollt, ein Listen socket geht beim
> schließen auf Time-Wait. Dafür musst du das Programm auch nicht killen,
> das passiert auch beim normalen Close.

Und die Schlussfolgerung, daß der Port deshalb noch offen ist, ist 
falsch. Er wird nur für eine gewisse Zeit blockiert.

von Da D. (dieter)


Lesenswert?

Rolf Magnus schrieb:
> Er wird nur für eine gewisse Zeit blockiert.

Aber warum?

von Oliver R. (orb)


Lesenswert?

Da Dieter schrieb:
> Aber warum?

Damit der Port nicht gleich wieder belegt wird und eventuell verzögert 
eintreffende Packete der alten Verbindung die neue stören.
Diese Funktion wird seit TCP-Einführung diskutiert und wurde teilweise 
als Schuldiger für ein zu langsames WWW herangezogen. Es gibt auch 
Entwürfe um ohne die Wartezeit auszukommen, z.B. RFC-1337, RFC-1323 ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.