TCP-Port schließen

Gast #3835134
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.
#3835212
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...
Gast #3835222
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.
#3835273
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.
#3838413
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 ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren