Forum: PC-Programmierung Windows, Anzahl freier Sockets feststellen


von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Servus,

für meinen Mailpproxy hätte ich gerne die Information wieviele
sockets noch verfügbar sind. Wie macht man das ? Einfach probieren
bis ende dürfte mir das System killen.

W7, GNU C++/C

von Socket (Gast)


Lesenswert?

Das dürfte mit der Anzahl der insgesamt noch verfügbaren 
Filedeskriptoren zusammenfallen.
Ganz frühe Linuxe hatten da ein 2^15 Limit.

von Jim M. (turboj)


Lesenswert?

Joachim D. schrieb:
> für meinen Mailpproxy hätte ich gerne die Information wieviele
> sockets noch verfügbar

Hat normalerweise mit der Anzahl der File Handles im Prozess zu tun, 
weil ein Socket ein File Handle belegt.

Limits hängen leider auch davon ab ob das ein 32-bit oder 64-Bit Prozess 
ist, sollten aber jenseits von 1000 liegen IMHO.

Jedoch sollte man bei einem Mailproxy auch die Gegenseite beachten, die 
Dich schon bei einer zweistelligen Verbindungszahl auf die "SPAM" Liste 
setzten und die Mitarbeit verweigern dürfte.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Das Programm lauscht an einem Socket. Kommt da etwas, macht
es per OpenSSL die Verbindung zum Provider (mit den Logindaten
des Clients, ich denke, da komme ich nicht auf die SPAM-Liste).

Die Anzahl filehandles kann ich vorgeben, die Sockets sind auf
max 65535 begrenzt (default sind es 256, auch einstellbar).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Joachim D. schrieb:
> die Sockets sind auf
> max 65535 begrenzt

Und das dürfte prinzipbedingt sein, und vor allem für alle Prozesse auf 
dem System in Summe gelten.
Schließlich wird mit jedem Socket eine lokale Portnummer assoziiert, und 
die wird mit einem uint16_t beschrieben.

von DPA (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Und das dürfte prinzipbedingt sein, und vor allem für alle Prozesse auf
> dem System in Summe gelten.
> Schließlich wird mit jedem Socket eine lokale Portnummer assoziiert, und
> die wird mit einem uint16_t beschrieben.

Ich hoffe doch sehr das heutige Systeme nicht mehr diese naive 
Implementierung verwenden. Eine Verbindung ist bei TCP durch 2 Ports und 
2 IPs gegeben, jeweils eine für die Source und eine für die Destination. 
Man hat also, sofern man einen Port festlegt, nicht nur 2^16 Ports 
insgesamt für alle Verbindungen, sondern 2^16 Ports für jedes Source 
Destionation IP paar. Bei IPv4, wenn man zusätzlich eine der IPs 
festlegt, hat man immer noch 2^32 Adressen mal 2^16 Ports für alle 
Verbindungen, also insgesamt 2^48 theoretisch mögliche Verbindungen. 
Natürlich müsste man da noch den ungültigen Port 0, Broadcast und 
Multicast Adressen, etc. davon abziehen, aber das Gesamt Limit für 
Verbindungen, die ein System offen haben kann, ist definitiv nicht wegen 
dem Wertebereichs von TCP Ports begrenzt.

von mmm (Gast)


Lesenswert?

DPA schrieb:
> das Gesamt Limit für
> Verbindungen, die ein System offen haben kann, ist definitiv nicht wegen
> dem Wertebereichs von TCP Ports begrenzt.

Das hat hier auch niemand behauptet. Das Limit waren die max. erlaubten 
offenen Filehandles.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

dh ich kann die erlaubte Anzahl Handles hochsetzen ?
Watcom C hat _grow_handles(), das gibt es bei GNU
anscheinend nicht ...

Ich habe schonmal 100.000 filehandles verwendet, weder
der Compiler noch das System hatten gemeckert.

von DPA (Gast)


Lesenswert?

mmm schrieb:
> Das hat hier auch niemand behauptet.

Lies den von mir zitierten Bereich nochmal, dort wurde es das.

von Jim M. (turboj)


Lesenswert?

Joachim D. schrieb:
> Das Programm lauscht an einem Socket. Kommt da etwas, macht
> es per OpenSSL die Verbindung zum Provider (mit den Logindaten
> des Clients, ich denke, da komme ich nicht auf die SPAM-Liste).

Nö, dann kommt der User auf die "naughty" Liste und wird 
gebannt/gesperrt. Sowas steht oft in den "Terms of Usage" mit drin.

Dann könnte eine zweistellige Anzahl Verbindungen gleichzeitig schon 
kritisch sein. Mails werden normalerweise hintereinander verschickt.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Jim M. schrieb:
> Dann könnte eine zweistellige Anzahl Verbindungen gleichzeitig schon
> kritisch sein. Mails werden normalerweise hintereinander verschickt.

Der User loggt sich ja "direkt" beim Provider ein. Kein Mailclient
macht dazu mehrere Verbindungen auf (nur TB bei IMAP).

von (prx) A. K. (prx)


Lesenswert?

Ein 64-Bit Windows scheint ein Limit von 16 Mio Handles zu haben. 
Jedenfalls hatte ich eine Weile mit einem Server zu tun, der das 
innerhalb von einigen Monaten schaffte.

Wenn man sich auf Sockets bezieht, hinter denen TCP- oder UDP-Ports 
stehen, dann steckt letztlich das 2^16 Limit dahinter, weshalb man nicht 
mehr als 64k offene Server-Sockets zustande bekommen dürfte. Bei denen 
gibts ja nur eine Seite. Verbindungen könnten es mehr sein, weil dann 
(und erst dann) beide Seiten der Verbindung eine Rolle spielen.

von tictactoe (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Joachim D. schrieb:
>> die Sockets sind auf
>> max 65535 begrenzt
>
> Und das dürfte prinzipbedingt sein, und vor allem für alle Prozesse auf
> dem System in Summe gelten.
> Schließlich wird mit jedem Socket eine lokale Portnummer assoziiert, und
> die wird mit einem uint16_t beschrieben.

Achtung, Klugsch****er voraus! ;)

uint16_t ist nicht der Grund für das Limit. Denn eine (TCP-) Verbindung 
wird durch das Tupel (lokale IP, lokaler Port, remote IP, remote Port) 
definiert. D.h. du kannst theoretisch weit mehr als 2^16 Verbindungen 
offen halten, solange sie nicht alle an die gleiche Gegenseite gerichtet 
sind.

von Jens G. (jensig)


Lesenswert?

tictactoe (Gast) schrieb:

>Achtung, Klugsch****er voraus! ;)

>uint16_t ist nicht der Grund für das Limit. Denn eine (TCP-) Verbindung
>wird durch das Tupel (lokale IP, lokaler Port, remote IP, remote Port)
>definiert. D.h. du kannst theoretisch weit mehr als 2^16 Verbindungen
>offen halten, solange sie nicht alle an die gleiche Gegenseite gerichtet
>sind.

Pro IP-Adresse kannste 64k Ports nutzen, denn mehr paßt ja nicht in den 
IP-Header pro Richtungen (bei IPv4)
Du kannst also bis zu 64k Serverports haben, oder bis zu 64k Clientports 
(dynamische Ports), oder irgendwas dazwischen. Zusammen eben nur 64k.
Haste mehr als eine Adresse auf einem NIC (alte Abkürzung ;-), kannste 
entsprechend mehr Connections nutzen (theoretisch).
Die Filehandles wären dann die nächste Grenze, je nach System.

von (prx) A. K. (prx)


Lesenswert?

Jens G. schrieb:
> Du kannst also bis zu 64k Serverports haben, oder bis zu 64k Clientports
> (dynamische Ports), oder irgendwas dazwischen. Zusammen eben nur 64k.

Du kannst aber einen einzelnen Serverport mit praktisch beliebig vielen 
verschiedenen Client-IP-Adressen anderer Systeme verbinden lassen, so 
lange pro solcher IP-Adresse nicht mehr als 64k Verbindungen zusammen 
kommen.

Ein effektives Limit stellt das also allenfalls dann dar, wenn 
beispielsweise ein gut belegtes CG-NAT System mit zentralen Services der 
Grössenordnung Googles in Spiel kommt.

: Bearbeitet durch User
von Jens G. (jensig)


Lesenswert?

@ A. K. (prx)

>Jens G. schrieb:
>> Du kannst also bis zu 64k Serverports haben, oder bis zu 64k Clientports
>> (dynamische Ports), oder irgendwas dazwischen. Zusammen eben nur 64k.

>Du kannst aber einen einzelnen Serverport mit praktisch beliebig vielen
>verschiedenen Client-IP-Adressen anderer Systeme verbinden lassen, so
>lange pro solcher IP-Adresse nicht mehr als 64k Verbindungen zusammen
>kommen.

Stimmt - jetzt, wo Du es sagst ;-)
Also limited by ressources ....

von Manfred (Gast)


Lesenswert?

Jim M. schrieb:
> Dann könnte eine zweistellige Anzahl Verbindungen gleichzeitig schon
> kritisch sein. Mails werden normalerweise hintereinander verschickt.

Zweifel! Der SMTP-Server ist eigene Software, Quelle der Mails ist ein 
Exchange-Server. Beide befinden sich innerhalb der Firma im selben 
Netzwerk.

Der Ziel-SMTP ist down, auf dem Exchange haben sich 150 Mails gesammelt, 
die er nicht direkt loswerden konnte. Der Exchange-Server versucht nun 
zwei Tage lang mit zunehmend längeren Zeitintervallen, den Ziel-SMTP zu 
erreichen.

Wenn ich den Ziel-SMTP hochfahre, kann ich beobachten, dass fast 
beliebig viele parallele Verbindungen aufgemacht werden. Ich habe nicht 
ermittelt, wie viele, auf jeden Fall deutlich zweistellig.

Da das Zielsystem mit SMTP noch mehr zu tun hat und diese Flut nicht 
ertragen kann, haben wir eine Abweisung implementiert und lassen nur 
eine niedrig einstellige Anzahl gleichzeitiger Verbindungen zu. Hier 
wird das dann aber sehr kritisch, welchen Abweisunsgrund man schickt und 
wie das Quellsystem damit umgeht.

Unabhängig davon: War da nicht vor Jahren mal ein XP-Sicherheitsupdate, 
was die Anzahl gleichzeitiger IP-Verbindungen einschränkt?

von (prx) A. K. (prx)


Lesenswert?

Manfred schrieb:
> wird das dann aber sehr kritisch, welchen Abweisunsgrund man schickt und
> wie das Quellsystem damit umgeht.

Mail-Server wie Postfix können die Anzahl eingehender Verbindungen 
begrenzen. Sowohl insgesamt als auch pro Client als auch pro 
Zeiteinheit.

In einem Server, der Spamassassin integriert und Spams gleich ablehnt, 
spielt der Ressourcenverbrauch des Spamassassin eine wesentliche Rolle, 
weshalb ich das entsprechend niedrig fahre, am üblichen Durchsatz 
orientiert. Deshalb kommt es gelegentlich vor, dass bei geballt 
eingehenden Verbindungen einige temporär abgelehnt werden.

Es sind bisher keine Probleme in der Mailkommunikation aufgefallen, 
jenseits von ein paar Minuten Verzögerung.

: Bearbeitet durch User
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.