IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

TServerSocket error 10055


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2
    Par défaut TServerSocket error 10055
    Bonjour,

    j'ai developpé un serveur à base d'un TServerSocket qui est basé sur WinSock si je ne dit pas de bétise.

    Mon serveur créer pour chaque connection cliente un thread permettant la communication, ceci marche bien.

    Au dessus de 2000 connection l'erreur 10055 est levé.

    Socket Error # 10055

    Socket error (#10055): No buffer space available.
    An operation on a socket or pipe was not performed because the system lacked sufficient buffer space or because a queue was full. This error indicates a shortage of resources on your system. It can occur if you're trying to run too many applications (of any kind) simultaneously on your machine. If this tends to occur after running certain applications for a while, it might be a symptom of an application that doesn't return system resources (like memory) properly. It may also indicate you are not closing the applications properly. If it persists, exit Windows or reboot your machine to remedy the problem.

    Cette erreur est elle dut à la conception de winsock, une limitation machine ou encore une limitation de OS.

    J'ai pu tester sur du win 2000 pro/ server ou encore du 2003 server. toujours cette restriction vers les 2000 connections.

    J'ai trouver cette source en .net parlant de IOCP, est ce la ou une solution pour resoudre ce problème?

    http://www.codeproject.com/useritems/IOCPNet.asp

    Indy 10 semble parler de IOCP pour palier ce problème.

    merci de votre aide

    gabriel

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 22
    Par défaut
    Bonjour.
    Désolé de ne pas repondre precisemment à ton probleme.

    As tu un outil te permettant de simuler tes 2000 connexions ?
    Lequel ? Je suis interessé

    Merci

    Bob

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2
    Par défaut
    Bonjour,

    j'ai crée juste une boucle qui instancie X clients, le serveur lui créer à chaque connection un thread qu'il mets en pause (le minimun pas de traitement). Au dessus de 2000 clients environ les nouveaux client recoit une erreur 10055.

    Je connais pas tres bien les possibilités des OS mais la ca fait 2000 threads et 2000 port ouverts. Les IOCP semble être une manière de contourné le problème :

    I/O completion ports add another dimension to this picture. They allow you to manage a pool of threads efficiently and control the amount of concurrency therein. In a client-server situation where a large number of clients connect to a server, it is not very viable to create a thread for each client, especially so if per-client interactions are not in high volumes or are sporadic. It is often a better method to pre-create a set of threads (a pool) and allocate them to the clients using some ad hoc scheduling scheme. Well, NT makes this very efficient !


    si quelqu'un connais les IOCP et peut en parler je serais preneur.

    merci

    voici le code client test :
    remarque : ici je ne me suis pas préocuper de la libération de la mémoire qui n'est pas le but de mon test et qui implique l'ajout d'un liste.

    TClientSocket *pvcl_bcClientSocket;
    pvcl_bcClientSocket= NULL;

    for(int i= 0; i < pvcl_plEditStep->Text.ToInt(); i++)
    { pvcl_bcClientSocket= new TClientSocket(NULL);
    pvcl_bcClientSocket->Active= false;
    pvcl_bcClientSocket->Port= pvcl_plEditPort->Text.ToInt();
    pvcl_bcClientSocket->Address= pvcl_plEditIP->Text;
    pvcl_bcClientSocket->OnConnect= void_pi_fcClientSocketConnect;
    pvcl_bcClientSocket->OnDisconnect=void_pi_fcClientSocketDisconnect;
    pvcl_bcClientSocket->OnError= void_pi_fcClientSocketError;
    pvcl_bcClientSocket->Active= true;

    //Sleep(50);
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 22
    Par défaut
    Bonjour.

    Utilises tu ton generateur de clients sur la meme machine que le serveur ?
    Si oui, voici une explication possible à ton probleme:

    Le stack IP de windows possede un parametre par defaut s'appelant MaxUserPort qui donne une limite maximum au numero de port local que peut prendre ta socket.

    Value Name: MaxUserPort Data
    Value Type: DWORD
    Value data: 65534
    Valid Range: 5000-65534 (decimal)
    Default: 0x1388 (5000 decimal)
    Description: This parameter controls the maximum port number that is used when a program requests any available user port from the system. Typically , ephemeral (short-lived) ports are allocated between the values of 1024 and 5000 inclusive.

    J'ai fait un test en generant un grand nombre de sockets (UDP, ce qui me permet de ne pas avoir besoin de serveur)... et j'ai la meme erreur que toi mais vers 4000 sockets ouvertes.
    J'imagine que si tu utilise ton serveur et tes clients sur la meme machine, alors tu divise par 2 ce chiffre (car paire de socket serveur/client) et tu tombes sur 2000. La valeur par defaut du parametre est 5000, mais compte tenu que mon PC (et le tien) utilise deja un certain nombre de socket pour d'autres applications, le nombre de 4000 sur lequel je tombe est coherent.

    Ensuite, j'ai essayé de modifier le parametre MaxUserPort à 65000 ... et bien je n'ai plus d'erreur.

    Tu devrais essayer de modifier aussi ce parametre, je pense que c'est ton probleme.
    Voici la page de reference Microsoft au sujet de ce parametre.

    http://support.microsoft.com/default.aspx?scid=kb;en-us;196271

    Bob

Discussions similaires

  1. ERROR: pg_atoi: zero-length string
    Par steelspirit92 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/08/2003, 22h29
  2. [SQL Server] Error converting data type varchar...
    Par Sir Tengu dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 13/06/2003, 10h46
  3. [Kylix] Kylix c++ error
    Par pacpac dans le forum EDI
    Réponses: 2
    Dernier message: 10/06/2003, 16h27
  4. [CR] Print Engine error text
    Par afaraji dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 03/09/2002, 15h44
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo