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++ Discussion :

Socket avec select


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Par d�faut Socket avec select
    Bonjour,

    Dites moi, il s'agit peut-�tre d'un comportement normal mais je souhaiterais m'en assurer. Je cr�e une socket serveur et j'ai une thread qui g�re les connections et les lectures, via un select. J'ai donc un fd_set dans lequel je rajoute tous les file descriptors des sockets. J'ai remarqu� qu'apr�s un select sur ce fd_set, ce dernier est modifi�: il y a des file descriptors qui changent, et le prochain select ne fonctionne pas correctement. Du coup, je suis oblig� avant chaque select de reconstruire le fd_set. Est-ce normal ? Cf mon code ci-dessous, avec les premi�res lignes qui permettent de reconstruire le fd_set:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    while(1)
    {
    	/* Building SocketList */
    	FD_ZERO(&SocketList);
    	for(ListNum = 0; ListNum < 5; ListNum++)
    	{
    		if(ConnectList[ListNum] != 0)
    		{
    			FD_SET(ConnectList[ListNum], &SocketList);
    		}
    	}
     
     
    	iResult = select(highDescriptor+1, &SocketList, NULL, NULL, NULL);
    	if(iResult < 0)
    	{
    		printf("Select failed\n");
    	}
    	else if(iResult == 0)
    	{
    		printf("Nothing ready to read\n");
    	}
    	else
    	{
    		if(FD_ISSET(ListenSocket, &SocketList))
    		{
    			printf("New connection received\n");
    			CurrentSocket = accept(ListenSocket, NULL, NULL);
    			if (CurrentSocket == INVALID_SOCKET) 
    			{
    				printf("Accept failed: %d\n", WSAGetLastError());
    				closesocket(ListenSocket);
    				WSACleanup();
    				return 1;
    			}
    			if(CurrentSocket > highDescriptor)
    			{
    				highDescriptor = CurrentSocket;
    			}
    			for(ListNum = 0; ListNum < 5; ListNum++)
    			{
    				if(ConnectList[ListNum] == 0)
    				{
    					ConnectList[ListNum] = CurrentSocket;
    					break;
    				}
    			}
    		}
    		else 
    		{
    			for(ListNum = 0; ListNum < SocketList.fd_count; ListNum++)
    			{
    				if(FD_ISSET(SocketList.fd_array[ListNum], &SocketList))
    				{
    					iResult = recv(SocketList.fd_array[ListNum], buffer, 14, 0);
    					printf("Deal with data: %s\n", buffer);
    				}
    			}
    		}
    	}
    }

  2. #2
    Mod�rateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur d'emploi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par d�faut
    Bonjour,

    Citation Envoy� par Khan34 Voir le message
    J'ai remarqu� qu'apr�s un select sur ce fd_set, ce dernier est modifi�: il y a des file descriptors qui changent, et le prochain select ne fonctionne pas correctement. Du coup, je suis oblig� avant chaque select de reconstruire le fd_set. Est-ce normal ?
    Oui, car c'est le m�me fd set qui va d'abord servir � indiquer les sockets � surveiller (avant l'appel) puis ensuite � indiquer les sockets signal�s et qui ont provoqu� le d�blocage de select().

    On est donc oblig� de le reconstruire.

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Par d�faut
    D'accord, merci pour la r�ponse !

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [SOCKET] Probl�me avec select()
    Par PaloPalo dans le forum Linux
    R�ponses: 4
    Dernier message: 01/12/2011, 15h34
  2. Socket TCP: probleme avec select()
    Par LinuxUser dans le forum R�seau
    R�ponses: 38
    Dernier message: 09/05/2007, 23h37
  3. Erreur de socket avec le composant Indy idHTTP
    Par Etanne dans le forum C++Builder
    R�ponses: 3
    Dernier message: 25/10/2004, 11h27
  4. [SOCKET] TCP : select devant send();
    Par trois_1 dans le forum D�veloppement
    R�ponses: 4
    Dernier message: 02/03/2004, 18h10
  5. utilisation de fetch avec select
    Par arwen dans le forum MS SQL Server
    R�ponses: 5
    Dernier message: 06/06/2003, 10h03

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