Thread-Limit und Netzwerkprogrammierung



  • Hallo!

    Ich möchte einen TCP-Server programmieren, der ähnlich wie ein Mail-Server unterschiedliche Verbindungen gleichzeitig unterstützt.
    Die Datenübertragung ist mir klar, listen, connect, ... machen mir keine Probleme.

    Jedoch habe ich ein Problem mit folgender Aussage auf einer Doku-Seite:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcekernl/html/_wcesdk_Win32_CreateThread.asp

    Dort steht:

    ...
    The number of threads a process can create is limited by the available virtual memory. The number of threads that can be created depends on the default stack size. If every thread has one megabyte of stack space, you can create 32 threads maximum. If you reduce the default stack size, you can create more threads.
    ...

    Das würde bedeuten, daß man maximal 31 Verbindungen gleichzeitig machen kann, wenn bei accept ein neuer Thread aufgemacht wird.

    Andererseits gibt es 2^16 Ports und somit gleich viele Verbindungen als Obergrenze.
    Wie umgeht man das Problem, wenn man nicht immer wieder neu verbinden möchte und eine TCP-Verbindung braucht (also keine UDP)?

    Danke für Eure Hilfe
    Joe



  • Halt nicht für jede Verbindung einen Thread aufmachen. Du kannst dafür nicht blockierende (asynchrone) Sockets verwenden. Unter Windows kannst du dir Nachrichten schicken lassen, wenn ein Socket Daten bereit hält und so in einem Thread mehrere Verbindungen behandeln. Unter Linux gibt es die Funktion poll dafür.



  • die dokumentation ist für Windows CE! ich glaube nicht das du das wirklich benutzt! unter windows kannst du so etwa 1000 oder 2000 threads erzeugen mit den normalen einstellungen.
    aber server die für jede verbindung einen thread erstellen sind extrem schlecht.
    wenn ein server für sehr viele verbindungen geeignet sein soll nimmt man unter windows overlapped i/o mit einem i/o completion port.



  • wobei progchild recht hat, man braucht nicht pro connection einen thread, das ist in den meisten faellen overkill. besesr ist es die threadanzahl an die prozessoren/core anzahl zu binden und auf diese dann die connections zu verteilen.




Anmelden zum Antworten